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.
T
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.
Hebert_Coelho
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.
Essa informação não está em algum lugar de cache ñ?
T
Thigogcs
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…
Hebert_Coelho
E como esse cache tá sendo feito? Singleton? valor estático? Cache de segundo nível?
pfk66
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.
como assim… desconecta e conecta novamente… vc deixa a conexão aberta o tempo todo?!
T
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!
Hebert_Coelho
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!
Você tem que utilizar um pool de conexão. Aí você não tem perda de performance.
pfk66
Conecta, faz o que têm que fazer, e desconecta. Pra que deixar a conexão aberta?
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.
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.
pfk66
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.
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.
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.
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.
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.
pfk66
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.
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.