Alguém saberia me dizer se existe algum evento que possua um Listener recebendo modificações do Banco de Dados?
Porque estou interessado em inserir esse tipo de evento em meu projeto, pois assim toda hora que uma coluna for modificada, o sistema que, esta em rede, dispara uma atualização automática dos registros, impedindo assim de que algum usuário possua informações antigas, se alguém em outro “cliente” do sistema modifique algo.
Cara, para resolver teu problema só me vem na cabeça criar uma tabela de log e monitorar essa tabela pela aplicação e fazer as atualizações necessárias.
Para uma comunicação direta do evento com a app, tenta ver alguma coisa com JMS
Na verdade isso expõe uma falha de arquitetura do seu projeto.
Pense a respeito.
Certa vez li sobre um recurso semelhante no Oracle 11, mas sendo como uma ferramenta experimental e que acarretaria em uma perda considerável de performance.
[quote=guilherme.dio]Alguém saberia me dizer se existe algum evento que possua um Listener recebendo modificações do Banco de Dados?
Porque estou interessado em inserir esse tipo de evento em meu projeto, pois assim toda hora que uma coluna for modificada, o sistema que, esta em rede, dispara uma atualização automática dos registros, impedindo assim de que algum usuário possua informações antigas, se alguém em outro “cliente” do sistema modifique algo.[/quote]
Putz! E envolver tudo numa mesma transação, não seria mais fácil?
Então… a maneira “correta” de fazer o que você está querendo fazer é puxar os dados e colocar um número de versão neles (coisa q eh feita automaticamente pelo JPA colocando @Version num campo Long). Aí, todos os usuários podem baixar o dado. Se alguém alterar o registro, o sistema incrementa o número de versão que já existia na tabela. Se outra pessoa fizer alguma alteração em cima do dado inicial e tentar persistir essa alteração, o sistema detecta que existe conflito entre as “versões” do dado e a segunda pessoa que tentar persistir esse dado vai receber uma exception, dizendo que o dado já foi alterado por outro usuário.
O nome formal dessa técnica é Lock Otimista (Optimistic Lock). O Martin Fowler escreveu a respeito no seu livro Patterns of Enterprise Application Architecture, e tem um trecho aqui falando a respeito.
entendi, mas eu acho isso meio que “gambiarra”, rsrsrs…pq oque eu queria fazer era ouvir a tabela, se sofrer qualquer tipo de alteração, todos os usuários que estivere com o sistema aberto sofreram um “refresh”, atualizando os jTables com as novas informações
Tanto não é gambiarra que é até um padrão catalogado pelo Martin Fowler e parte da JPA. Está longe de ser uma gambiarra.
A solução que você está procurando seria um verdadeiro atentado à escalabilidade. Só para manter isso seria necessário que você usasse AJAX reverso (que é bastante pesado), ficar lendo e relendo tabelas toda hora e etc. Ou seja, é absurdo.
Vocês estão confundindo as coisas.
Tanto o lock otimista quando o lock pessimista servem para evitar problemas de concorrência.
O que não tem nada a ver com o a situação descrita.
O correto mesmo seria o sistema que ele projetou gerar um tipo de evento (programaticamente, não escutando o banco) quando forem alterados esses registros no banco, dai quem for o interessado capturar esse evento e fazer o que quer que seja.
Ficar varrendo o banco em busca de alterações é gambiarra. Evite polling.
Agora se N sistemas fizerem alterações diretamente na base em M pontos de casa sistema, bem, dai você tem uma falha grave de arquitetura, conforme suspeitei no meu primeiro post.
Hmmm…pensei em usar Delegate, para pegar eventos disparados dos computaodres clientes, então atualizar os frames conforme cada computador recebe o disparo…porém, eu não sei se no Java existe Delegate, porque já usei em C#…