Hibernate + Oracle 10ge + Locks

8 respostas
A

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?

8 Respostas

Rafael_Guerreiro

Limite creio que não…

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

A

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);

Rafael_Guerreiro

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

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.

A

As sessões são controladas pelo pool de conexões.

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

Rafael_Guerreiro

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.

A

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.

Rafael_Guerreiro

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.

A

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

Criado 10 de junho de 2013
Ultima resposta 10 de jun. de 2013
Respostas 8
Participantes 2