Notificar cliente quando houver alguma alteração no banco de dados

Você não vai implementar a função dentro do workbench, mas sim fora. É uma forma de adicionar funcionalidades ao MySQL, já que ele é open source. Funciona mais ou menos assim:

  1. Você vai baixar o source do MySQL;
  2. Dentro dos arquivos, tem um arquivo na pasta sql chamado de udf_example.cc, que tem exemplos de como essas funções são implementadas (link do github com esse arquivo: https://github.com/mysql/mysql-server/blob/5.7/sql/udf_example.cc);
  3. Você vai criar teu arquivo c++, incluir os cabeçalhos do mysql e programar tua função;
  4. Você vai gerar o object code do teu arquivo e em seguida (pelo que eu entendi) vai precisar recompilar o mysqld (o servidor do mysql), com a tua função junto.

Tem uns avisos lá que os cabeçalhos da standard library talvez não estejam disponíveis. Tem que ler o que tem na documentação pra entender tudo certinho.

Eu acredito que não é para esse teu propósito que esse mecanismo de extensibilidade foi feito. Escute o que eu to te falando não vá atrás disso, porque vai dar muito trabalho (principalmente se você não for um ninja de c/c++ e entender como funciona o processo de dynamic linking). Implemente uma API web, por onde absolutamente TODAS as alterações nos dados serão feitas (não pode atlerar nada pelo workbench, nem por nenhum outro lugar, só pela API).

Como eu te falei, não é impossível, mas vai dar muito trabalho e tem que estudar pra caramba. Com certeza é um exercício muito legal pra aprender bastante coisa, caso tu não saiba como esses esquemas funcionam.

Contudo, acho que é MUITO melhor pra ti aprender a fazer a API fazendo as notificações em tempo real como conversamos. Se tu coloca um negócio desse no teu GitHub como portifólio, pode ter certeza que você vai sair na frente de muita gente.

Isso é simplesmente fantástico![quote=“lvbarbosa, post:21, topic:343653”]
Eu acredito que não é para esse teu propósito que esse mecanismo de extensibilidade foi feito. Escute o que eu to te falando não vá atrás disso, porque vai dar muito trabalho (principalmente se você não for um ninja de c/c++ e entender como funciona o processo de dynamic linking). Implemente uma API web, por onde absolutamente TODAS as alterações nos dados serão feitas (não pode atlerar nada pelo workbench, nem por nenhum outro lugar, só pela API).
[/quote]

Cara, a ideia da API web é boa, mas minha experiência com web é muito pouca. Eu aprendi as linguagens principais (HTML, CSS, JavaScript e PHP) mas não desenvolvi nada desde então. Vai dar o mesmo trabalho. Eu prefiro ter um model que faça isso. Eu já tenho o sistema para dizer quais dispositivos estão com o cliente ligado e eu simplesmente faço a comunicação via socket entre eles, mas eu queria essa função em C++ para quando eu estiver fazendo as alterações manualmente, mas se é tão difícil assim, pelo menos enquanto eu desenvolvo, eu vou manter um botão de atualizar em cada cliente.

@Thallysson eu te perguntei no começo, você me respondeu e eu esqueci de comentar, a respeito do quão importante é o update dos clientes o mais rápido possível.

Quanto mais rápido, mais chato é de implementar. Se você puder abrir mão da sincronia até um certo ponto, faça-o, porque vai simplificar bastante as coisas. Você pode simplesmente abandonar essa ideia de socket e usar um pooling menos agressivo (verificar se há atualizações quando o usuário abre uma certa tela, por exemplo).

A Apple, por exemplo, oferece várias soluções pros usuários que são sincronizadas. O aplicativo deles de notas serve de exemplo. Quando você edita uma nota em um dispositivo, todos os outros dispositivos que estão com tua conta logada devem ser atualizados com as mudanças efetuadas. Esse update não é feito freneticamente, demora alguns segundos. Não é algo que compromete a usabilidade do negócio! E outra, sempre dá pra apertar um botão ou fazer um gesto na tela pra pedir pro aplicativo dar um refresh e ver se tem alguma atualização.

1 curtida

A minha aplicação já tem esse tipo de atualização. Tipo quando troca de aba na TabPane é executada uma atualização, mas o problema é que a maior parte do tempo o usuário vai ficar com foco na caixa de texto, e a mesma já possui um listener que a cada tecla digitada altera algo no banco, e isso já consome bastante performance não? Bem, eu não percebi lentidão na interface e nem o fan do meu cooler girar mais rápido, mas acho que em um computador mais lento teria algum problema. Se eu for implementar a atualização assim, acha que teria problema? Tipo, a cada tecla também atualizar. Daria muita confusão?

Se eu precisasse fazer alguma parte em pooling, saberia me dar uma exemplo de em quanto em quanto tempo eu deveria fazer essa verificação? Um segundo? Menos?

Agora que eu vi que tava escrevendo polling errado esse tempo inteiro kkkkkk. São dois L, não dois O. Pooling tem a ver com pool de recursos (como conexões ou threads), e polling tem a ver com questionar. Mas enfim!

Depende da aplicação… quanto menor o intervalo, menor é o impacto na performance do servidor, mas também a atualização é mais lenta. Existe esse trade-off.

Coloca algo entre 5 e 15 segundos, acho que é aceitável. Você pode também fazer isso de forma dinâmica. Por exemplo:

  • Quando não há atualizações por um bom tempo (sei lá, um minuto), você pode diminuir a frequência (aumentando o tempo para 20 segundos);
  • Quando há uma atualização, você pode aumentar um pouco a frequência, porque a chance de novas atualizações ocorrerem pode ser um pouco maior;

Vai da tua criatividade e da necessidade da aplicação. Vai testando aí!

Oi. Eu resolvi o problema faz um tempinho, mas eu me lembro que disse que voltaria aqui pra dizer como foi. Bem, eu adicionei alguns listeners em algumas partes do programa como na troca de itens de uma lista, e coisas do tipo. Além disso, cada dado que depende do banco eu fiz um processo paralelo que executa o pooling. Todos no intervalo de 5 segundos, mas com algumas exceções, como naquela caixa de texto que eu citei. Quando o usuário não está digitando nela, o pooling é executado, porém caso ele comece a digitar, é dado um “pause”.