Capturar sql gerado pelo hibernate no console

26 respostas
furacao123

Aew galera preciso de alguma maneira integrar duas aplicações com mesma estrutura no banco de dados mas em bancos fisicamentes diferentes pensei em fazer com arquivos xml exportando e importando valores mas isso pode ser falho pois os arquvos podem ser editados por alguem, entao pensei da seguinte forma, pegar o sql gerado pelo hibernate, por exemplo um update eu capturo esse sql e de alguma forma capturo tb os valores que estao sendo atualizados, gravo em uma string e quando a outra aplicação acessar esses dados eu passo essa string para uma sql nativa e faço a aplicação executar e assim sincronizo os dois bds, mas a duvida é como capturar esse sql do hibernate?

26 Respostas

romarcio

Você pode usar JMS para fazer isso.
A cada insert ou update feito em um banco você gera uma mensagem com os dados do insert ou update, dai a outra aplicação consome essa mensagem e atualiza sua base através dos dados da mensagem.

furacao123

opa vou dar uma olhada mas só pra ir adiantando sao aplicações desktop

J2SE + Swing

seria possivel utilizar JMS sem um servidor de aplicação

romarcio

JMS é uma API java para troca de mensagens.

Você vai ter um servidor que ira armazenar as mensagens, esse servidor pode ser web(JBoss) ou não(ActiveMQ).

Cada uma das aplicações deverá ter implementado uma classe para consumir e/ou enviar mensagem para o servidor.
A classe que consome fica escutando se chegou uma mensagem no servidor, se chegou ela vai lá e consome a mensagem.
Dai você pega os dados dessa mensagem e faz o insert ou update no banco de dados.

É obrigado a ter um servidor.

furacao123

entendi o problema é o seguinte é uma aplicacao onde tenho os pontos de venda e 1 retaguarda só o retaguarda faz os cadastros e os pontos de venda as vendas entao a cada cadastro eu disparo pra todos os pontos de vendas atualizarem os registros e qdo tem venda o retaguarda importa as vendas eu poderia usar um BD centralizado mas o problema é que tem de funcionar sem rede, como é no caso do ECF entao tenho de armazenar tudo e em determinado tempo a rede fica ligada e eu disparo as alterações

romarcio

Entendi.
Mas com JMS você pode fazer isso, mesmo com o problema da rede. Desde que a aplicação que envie as mensagens fique na mesma máquina do servidor, para que ela fique criando a fila de mensagens no servidor.
Dai a outra aplicação só vai consumir quando enxergar o servidor ativo, na verdade quando a rede for liberada o servidor vai aparecer ativo para a outra aplicação.
Como vc parece que tem aplicações desktop, o servidor poderia ser o ActiveMQ. Ele é bem leve e consome muito pouco recurso da máquina.

furacao123

vou dar uma olhada nesse ActiveMQ voce ja usou?

romarcio

Usei para fazer um exemplo de chat, tenho um tutorial dele: http://mballem.wordpress.com/2011/02/09/chat-jms-com-activemq/

furacao123

valew

entao no caso eu teria de instalar o ActiveMQ no retaguarda para que ele disparace quando acontece alguma alteração no banco, no caso pra cada maquina eu crio uma conexao e envio a msg e em cada maquina eu preciso ter tambem instalado o ActiveMQ correto?

pois as maquinas tambem enviarao msgs que seriam as vendas

romarcio

Não, você precisa instalar o ActiveMQ em apenas uma máquina e ele vai estar sempre rodando.
As suas aplicações vão apontar para ele, através de uma url e do nome da fila de mensagens.

Sua aplicação quando executar uma venda, envia uma mensagem para o ActiveMQ, dai a aplicação de retaguarda vai estar “escutando” a fila de mensagens e vai ser acionada, consumindo essa mensagem.
Essa fila vai sendo incrementada caso a aplicação de consumo não faça o consumo das mensagens.

Então no caso que vc citou, se eu entendi bem, a sua aplicação que faz as vendas deveria ter acesso ao ActiveMQ sempre, pq sempre que ela fizer uma venda vai enviar essa mensagem para o servidor. Essas mensagens vão sendo armazenadas no servidor até que a rede seja liberada e a aplicação de consumo comece a consumir esta fila.

furacao123

entao na verdade é assim por exemplo tenho 1 retaguarda e varios pontos de venda

o banco do retaguarda contem todas as vendas de cada ponto de venda ja os PDV nao enxergam um ao outro

cada PDV tem a mesma estrutura do BD que tem no retaguarda mas apenas com as suas respectivas vendas locais
quando altero algum produto por exemplo do retaguarda ele dispara para todos os PDV ativos se a rede estiver bloqueada ele tem de armazenar e aguardar ate a liberacao da rede para enviar o mesmo acontece com os PDV quando acontece uma venda mas no caso cada PDV só vai enviar para o Retaguarda assim no retaguarda tenho o controle de estoque etc… e no PDV os dados de produtos, etc atualizados

romarcio

Isso mesmo.

Mas uma dúvida, os PDV estão todos na mesma rede? Ou tem PDV em rede separada.

P

Que banco de dados vc usa ?

P

Criptografa o XML !!!

furacao123

Estou utilizando Postgres 8.4

entao todos os pdvs estao na mesma rede

o problema é se o usuario apagar um arquivo vai dar inconsistencia no retaguarda ou no caixa

romarcio

Se todos os PDVs estão na mesma rede, você vai precisar apenas de um ActiveMQ que receberá as mensagens de todos os PDVs.
Dai como a retaguarda está em uma rede que fica bloqueada e ela também vai enviar mensagens para os PDVs, é melhor ter um ActiveMQ próprio para a retaguarda.

furacao123

implementei o activeMQ mas surgiu uma duvida, por exemplo dos PDVS enviarem para o retagarda tranquilo pois as msg ficarao em espera e só o retaguarda ira receber msgs, mas e na hora de enviar para os PDV, pois o Retaguarda vai enviar apenas 1 msg por exemplo um INSERT e todos os PDVS vao ter de receber esse INSERT, mas no caso se eu utilizar apenas um ActiveMQ no retaguarda ele vai gerar 1 msg e o primeiro PDV que se conectar e receber a msg vai dar o INSERT os demais nao, por exemplo funcionaria como um chat com grupo de pessoas todas tem de receber a msg mas nao duplicada como eu faço?

furacao123

Se todos os PDVs estão na mesma rede, você vai precisar apenas de um ActiveMQ que receberá as mensagens de todos os PDVs.
Dai como a retaguarda está em uma rede que fica bloqueada e ela também vai enviar mensagens para os PDVs, é melhor ter um ActiveMQ próprio para a retaguarda.

Entao na verdade cada PDV tem de rodar independente de rede, assim os PDV tambem vao precisar ter o ActiveMQ instalado pois eles enviarao mensagens de venda e se estiver sem rede as mensagens vao se perder, entao preciso instlar o ActiveMQ tambem na maquiina para que ele armazene as mensagens para assim que a rede voltar disparar, pensei em fazer o seguinte crio varias queue por exemplo

SERVIDOR.Retaguarda , SERVIDOR.PDV1, SERVIDOR.PDV2, etc

o Retaguarda tera um cadastro dos PDVS entao ao fazer qualquer alteração no Retaguarda eu disparo para todas as queue criadas PDV, e faço ele ficar recebendo msgs de todas as queue Retaguarda presente nos PDV

em cada PDV eu crio uma queue SERVIDOR.Retaguarda e disparo as msg nele

esta correto o raciocinio?

romarcio

Se cada PDV vai rodar independente de rede, a melhor solução é ter um ActiveMQ para cada um mesmo.
Já no retaguarda, você vai ter um ActiveMQ também. Sendo que todos os PDVs vão enxergar essa fila da retaguarda. Quando o 1° PDV consumir essa fila, a mensagem já não estará disponível para os outros PDVs, então não terá problema de duplicidade de mensagem.

Agora, como vc terá mais de um ActiveMQ no lado dos PDVs, você vai dar um nome para cada uma dessas filas, e terá que indicar para a aplicação retaguarda cada um desses nomes. Isso é fácil, cria uma lista com o nome e ip de cada fila.

romarcio

Relendo suas 2 ultimas mensagens, acabei ficando confuso em relação as mensagens enviadas pelo retaguarda.
Então vou responder de 2 formas.

Se o retaguarda vai enviar uma mensagem que deverá ser recebido pelo 1° PDVs que estiver na rede, dai você vai usar o conceito de fila(Queue), onde temos um ou varios produtores mas apenas um consumidor. Assim, o 1° PDV que chegar consome a mensagem e ela sai da fila e nenhum outro consome.

Se o retaguarda precisa enviar uma mensagem igual para cada um dos PDVs, onde todos receberão a mesma mensagem e darão o insert, você deve usar o conceito de assinaturas(Topic). Assim, cada mensagem só será consumida definitivamente quando todos os PDVs inscritos nesse tópico a tiverem consumido.

furacao123

entao preciso utilizar o conceito de topicos pois uma mensagem gerada no retaguarda vais er consumido por todos os PDV, mas a duvida é a seguinte quando eu trabalho com Topico nao tem como guardar as msg caso a rede esteja fora, só visualizo o que esta conectado correto?

romarcio

Um tópico JMS pode ser de dois tipos, durável e não durável. Quando um tópico é configurado como durável o assinante não precisa estar conectado no momento em que o produtor envia a mensagem para o servidor, ela permanece no servidoraté que o consumidor esteja ativo e faça o consumo dela. O tópico não durável o assinante deve estar ativo para receber a mensagem, caso não esteja a mensagem não será entregue.

furacao123

opa valew entao vou dar uma olhada pois segui o tutorial do seu blog vou tentar alterar mas acho que o que eu preciso é como Topic mesmo onde o retaguarda dispara um topic e os caixas recebem

ja nos caixas eu configuro como queue, mas vou ter de instalar o ActiveMQ em cada caixa tb, ae disparo na fila as msg e o retaguarda vai importando

romarcio

É acho que é bem isso que você deve fazer.
Obs: te mandei um email, da uma olhada.

furacao123

Opa valew amanha vou dar uma olhada nesse livro

P

Use o recurso de replicação de base de dados, é um recurso do proprio banco.

furacao123

mas no meu caso eu nao replicaria todo o banco e sim alguns dados de venda para o banco de retaguarda e a parte de cadastros para o pdv isso eh possivel ?

Criado 28 de fevereiro de 2011
Ultima resposta 17 de mar. de 2011
Respostas 26
Participantes 3