Estou com alguns problemas de lock, o sistema fica tavado e só volta ao normal quando eu acesso o gerenciador do oracle e finalizo manualmente as transações que estão travadas.
Alguém sabe se tem como colocar um limite para as transações no hiberante ou no oracle?
[quote=apalmeira]O commit/rollback é feito no filter (OpenSessionInView).
[/quote]
Vamos com calma, isso é diferente de fechar a sessão, para fechar a sessão vc precisa fazer:
É preciso ter um desses para cada sessionFactory.openSession(); que você fizer.
Você não vai colocar esse limite, ele é imposto pelo banco de dados. Isso que você colocou é o TIMEOUT, ou seja, é o tempo que a TRANSACTION vai estar ativa, que é diferente da sessão.
As sessões NÃO são controladas pelo pool de conexões, como você disse, é um pool de CONEXÕES e não de SESSÕES.
Você precisa de uma conexão para abrir uma sessão e de uma sessão para abrir uma transação. São coisas diferentes.
setTimeout é OUTRA coisa. Se o seu insert, ou coisa assim, demorar mais de 5 (milissegundos) o transaction vai abortar e ponto final. Não é isso que está dando esse problema.
Ex: Acesso algum registro diretamente no banco de dados, faço uma alteração e peço para salvar, mas não dou commit.
Acesso o mesmo registro através do sistema, faço uma alteração e peço para salvar. Aqui o sistema tava, pois o mesmo registro esta com lock no banco de dados. É aqui que eu quero setar um tempo, para que a operação seja cancelada.
O transaction.setTimeout() não resolve o problema.
Mas isso ocorre somente quando você faz esse teste?
Pois isso é uma situação que eu chamaria de normal… Se duas sessões da sua aplicação mexerem no mesmo registro, vai ter um tempo de espera mesmo, mas muito pequeno.
Direto no sistema é raro ocorrer isso, mas quando ocorre um módulo inteiro fica travado e não libera enquanto eu não for no oracle e finalizar a sessão.
Eu consegui simular da formar que eu lhe informei, e dessa forma também trava e não libera enquanto eu não executar commit/rollback ou finalizar a sessão.
O que eu queria se possível, é configurar um tempo para que o módulo não trave. Poderia retornar uma exception para o usuario saber que ocorreu um “erro”.