Tenho uma aplicação java instalada em duas maquinas diferentes que acessam o mesmo banco de dados (MYSQL).
Quando faço uma alteração em uma aplicação, a outra só consegue enxergar essa alteração se eu sair e entrar novamente no sistema.
O projeto fica fazendo “pooling” procurando por dados novos. Nesse caso você poderia criar um campo como “ultima atualização” ou coisa do tipo. Se houver alguma alteração, você manda o projeto fazer refresh.
Outra abordagem seria enviar uma notificação ao outro projeto dizendo “existe atualização”, e nisso ela vai buscar a novidade no banco.
Acho que não ficou bem claro o que eu queria. O problema não está em saber o momento que foi feita a atualização.
Exemplo:
O banco de dados possui um celular que custa 300$.
Maquina1 altera o preço desse celular para 400$.
Quando a Maquina2 faz uma busca desse produto no banco de dados, ele traz o preço 300$.
Se eu saio do sistema na Maquina2 e entro novamente, ai sim ele consegue buscar o preço de 400$.
A única forma que consegui fazer foi quando o usuário for fazer a busca de produtos no sistema, ele desconecta e conecta no banco novamente, mas acho que seria muita gambiarra.
[quote=Thigogcs]Acho que não ficou bem claro o que eu queria. O problema não está em saber o momento que foi feita a atualização.
Exemplo:
O banco de dados possui um celular que custa 300$.
Maquina1 altera o preço desse celular para 400$.
Quando a Maquina2 faz uma busca desse produto no banco de dados, ele traz o preço 300$.
Se eu saio do sistema na Maquina2 e entro novamente, ai sim ele consegue buscar o preço de 400$.
A única forma que consegui fazer foi quando o usuário for fazer a busca de produtos no sistema, ele desconecta e conecta no banco novamente, mas acho que seria muita gambiarra.[/quote]Essa informação não está em algum lugar de cache ñ?
Provavelmente a info fica gravada em cache na memória, e por isso traz o resultado antigo de 300$, preciso de algum comando para limpar esse cache ou algo do tipo. To meio perdido…
[quote=Thigogcs]Acho que não ficou bem claro o que eu queria. O problema não está em saber o momento que foi feita a atualização.
Exemplo:
O banco de dados possui um celular que custa 300$.
Maquina1 altera o preço desse celular para 400$.
Quando a Maquina2 faz uma busca desse produto no banco de dados, ele traz o preço 300$.
Se eu saio do sistema na Maquina2 e entro novamente, ai sim ele consegue buscar o preço de 400$.
A única forma que consegui fazer foi quando o usuário for fazer a busca de produtos no sistema, ele desconecta e conecta no banco novamente, mas acho que seria muita gambiarra.[/quote]
como assim… desconecta e conecta novamente… vc deixa a conexão aberta o tempo todo?!
[quote=Thigogcs]Sim, deixo a conexao aberta, o certo é desconectar e conectar o banco a cada ação que eu fizer nele? Achei que isso deixaria o sistema mais lento![/quote]Você tem que utilizar um pool de conexão. Aí você não tem perda de performance.
Se fazes dessa forma, estás a fazer mal e a colocar um grande overhead a cada operação para abrir e fechar conexão. O que tu provavelmente fazes é usar uma pool de conexões. Aí, pedes uma conexão à pool para efetuar a operação e devolves. Mas não estás a abrir e fechar conexões, porque elas já estão abertas na pool.
E se a aplicação é desktop e single thread, não é necessário ter a pool, uma vez que só vai precisar sempre de uma conexão. Neste caso basta ter essa única conexão sempre aberta.
[quote=pmlm]
Se fazes dessa forma, estás a fazer mal e a colocar um grande overhead a cada operação para abrir e fechar conexão. O que tu provavelmente fazes é usar uma pool de conexões. Aí, pedes uma conexão à pool para efetuar a operação e devolves. Mas não estás a abrir e fechar conexões, porque elas já estão abertas na pool.[/quote]
Em nenhum momento eu disse que a conexão aberta precisa ser nova, ou que ao fecha-la, ela precisa ser destruída. Claro que você pode reciclar conexões, mas isso é detalhe de infra, e a pergunta é sobre código de aplicação.
[quote=pmlm]
E se a aplicação é desktop e single thread, não é necessário ter a pool, uma vez que só vai precisar sempre de uma conexão. Neste caso basta ter essa única conexão sempre aberta.[/quote]
Se você fizer isso, vai ter o mesmo problema do autor do tópico quando duas aplicações single-thread tentarem usar o mesmo banco.
Estamos a falar de conexão e não de transação, que são coisas diferentes. Uma conexão, várias transações.
Duas aplicações single-thread, cada uma com a sua conexão e a correta gestão de transações funcionam perfeitamente.
O problema dele pode ser, tal como o Hebert já falou, de cache ou pode ser por estar a usar sempre a mesma transação e o isolation level não permitir ver o que é commited na outra transação.
[quote=pmlm]Estamos a falar de conexão e não de transação, que são coisas diferentes. Uma conexão, várias transações.
Duas aplicações single-thread, cada uma com a sua conexão e a correta gestão de transações funcionam perfeitamente.
O problema dele pode ser, tal como o Hebert já falou, de cache ou pode ser por estar a usar sempre a mesma transação e o isolation level não permitir ver o que é commited na outra transação. [/quote]
Sim, é problema de cache. E a solução é pegar a conexão sob demanda, ao invés de ficar agarrado a ela o tempo todo. Não estou falando de transação.