Threads e Banco de Dados

bom dia pessoal, estou precisando de uma ajudinha para entender um negocio…

primeiro vamos entender meu cenario…

preciso fazer uma aplicao (vamos chamar de A1) q leia registros de uma tabela (vamos chamar de T1) q alimentada por uma outra aplicao (vamos chamar de A2), a A2 grava um registro na T1 na entrada de um evento e outro registro na saida desse mesmo evento, com a A1 eu leio esse resgistro do evento de entrada e gravo em outra tabela (T2), em seguida deleto o registro da T1, mando as informaes desse registro por email, em seguida ou um tempo depois registrado pela A2 o registro do evento de saida, a A1 captura esse registro e atualiza o registro de entrada com a hora de saida e deleto o registro de saida da T2…fao isso pq a T1 no normalizada, a A2 no foi muito bem contruida no passado e tem informaes irrelevantes para hj…ate aqui ok…

o q fiz para resolver…

criei uma singleton para fazer a conexo com o banco…

criei duas classes q extends Thread, e cada uma obtem a conexo da singleton,
uma dessas classes (C1) fica responsavel pela captura do registro de entrada da T1, inserir na T2, enviar por email e excluir da T1,
sequencia logica
tenho um while true para manter a thread viva e dento de um while q s executa a logica abaixo quando tiver 1 ou mais registro na tabela…
1 - efetura um SELECT no banco
2 - com as informaes chama o metodo de outra classe (C3) para o envio de email
3 - efetua um DELETE no banco

a outra classe (C2) faz o mesma coisa s que com o registro de saida, s nao envia por email…

nessa C3 ela tb ativa uma outra classe contendo Thread…s q no momento do teste no estou usando, ento ela somente esta enviado o email e ativando essa Thread…ok

meu problema!

rodo as duas aplicaes, atraves da A2 foro um evento para ser gravado, a A1 captura esse evento, manda por email s q a ao meu ver a thread para ai, se eu tirar esse evento a C2 executa normalmente enquando a C1 ainda esta naquele ponto, se entrar com outro evento a C1 continua se tirar esse ultimo evento a C2 executa

no sei se tem haver com a Thread q ativei mais no estou usando, pode ser q ela esteja usando o processamento?!?!

para fazer um teste contrui um JFrame basico para ver alguns logs…acontecia a mesma coisa…so q quando minimizava e restaurava a tela o processo da C1 executava de onde tinha parada, meio q ela “acordava” quando mexia no JFrame criado…achei estranho!!!

alguem tem uma ideia do q pode estar acontecendo???

posso ter duas threads acessando o banco? isso esta acarretando concorrencia ou algo do tipo???

desde ja obrigado!!!

PS: foi um pouco longo, e meio complexo de explicar, espero q entendam…qualquer coisa posto o codigo depois

Seu Singleton pode ser a raíz dos seus problemas.

O singleton é a mesma instância que está sendo compartilhada pelas duas threads. Ambas as threads percorrem os métodos do singleton ao mesmo tempo. A dúvida é, seu Singleton é thread-safe?

[quote=ViniGodoy]Seu Singleton pode ser a raíz dos seus problemas.

O singleton é a mesma instância que está sendo compartilhada pelas duas threads. Ambas as threads percorrem os métodos do singleton ao mesmo tempo. A dúvida é, seu Singleton é thread-safe?[/quote]

Vinny, não seria esse o caso de esquecer o singleton thread safe e cada thread ter sua própria conexão num ThreadLocal ?

o quer seria thread-safe?

pensei nisso da singleton ser o problema, ate pesquisei sobre pool de conexao, para ver qual seria melhor para usar, estou em duvida ainda?

[quote=Ssalgado]
Vinny, não seria esse o caso de esquecer o singleton thread safe e cada thread ter sua própria conexão num ThreadLocal ?[/quote]

Seria.

Thread-safe é um código que pode ser executado simultaneamente, por várias threads, de maneira válida.

Como threads compartilham memória, o acesso compatilhado a variáveis sem qualquer tipo de controle pode gerar um comportamento indesejável. Nesse caso, você não tem thread-safety.

Via de regra, em código multi-thread tenha uns 50 tipos de calafrios diferentes com variáveis estáticas. Elas são especialmente problemáticas nesse contexto.

O pool é a melhor solução. Ele combina os thread-locals, citados pelo Ssalgado com mecanismos inteligentes de fechamento e restauração da conexão. Com isso, vc acaba tendo um programa com mais performance, sem ter tanto trabalho assim.

Eu recomendo que você use o DBCP do projeto Jakarta, preferencialmente em conjunto com o Spring Framework ou com o Hibernate.

obrigado galera pela ajuda, vou tentar implementar com as dicas q vcs deram, qualquer duvida volto a entrar em contato!

obrigado mais uma vez…falow