Hibernate + Oracle 10ge + Locks

Bom dia pessoal,

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?

Limite creio que não…

Mas verifique se você não está deixando as sessions abertas. Essas sim tem limite e travam o sistema.

O commit/rollback é feito no filter (OpenSessionInView).

E como eu poderia colocar um limite na sessão?

Tentei colocar limite na transação dessa forma, mas não funcionou:
transaction.setTimeout(5);

[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 são controladas pelo pool de conexões.

Agora esse transaction.setTimeout(5) não funcionou aqui.

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.

Vou detalhar o meu problema:

  1. Ex: Acesso algum registro diretamente no banco de dados, faço uma alteração e peço para salvar, mas não dou commit.

  2. 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”.