Dúvidas Hibernate Dao

8 respostas
R

Às vezes no Hibernate da essa exceção:

Caused by: java.sql.BatchUpdateException: Tempo de espera (timeout) de travamento excedido. Tente reiniciar a transação.

E isso sempre ocorre depois de erros no Dao's portanto acho que estou fazendo algo que me dê esse erro.

Exemplo:

public List<?> getList() throws Exception {
		
		try {
			
			tento fazer algo...
		
		} catch(GenericJDBCException e) {
		
			throw new DaoException("Não foi possível acessar o servidor. Tente novamente em alguns minutos.", e);
			
		} catch(Exception e) {
			
			throw new FlexException("Ocorreu um erro não reconhecido pelo sistema.Entre em contato com o suporte para solucionar esse problema.", e);
			
		}
	
	}

Quando dá um erro na transação o correto é eu fazer um rollback na transação e fechar a sessão?
Quais outras práticas são necessárias para evitar erros posteriores?

8 Respostas

Pedrosa

Use Spring, ele gerencia suas transações automaticamente com uma anotação seu problema acaba:
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/pdf/spring-framework-reference.pdf :wink:

Andre_Brito

Você está usando JDBC ‘puro’?

R

@Pedrosa

Usava Spring mas com ele não conseguia trocar o banco de dados em runtime.Então to fazendo esse gerenciamento do Hibernate na unha mesmo…Até o momento não havia encontrado nenhum problema…

@Andre

Como assim? Não estou JDBC, se for pelo catch na exceção é por causa das exceções geradas pelo Hibernate quando há problemas na conexão serem deste tipo.

Andre_Brito

Ah! Agora que fui ler o título que é Hibernate :x, foi mal!

Você está usando JBoss? Se sim, ele controla as transações (as transações ‘viram’ CMT - Container Managed Transactions). Se você não está usando JBoss (ou algo do tipo, BMT), seria interessante você tentar criar uma factory (pode ser na main, executando como aplicação Java - sem subir o servidor), abrir e fechar o banco. Se funcionar, tenta fazer uma operação de leitura (consulta, por exemplo, que não exige uma transação aberta). Se funcionar, tente adicionar alguma coisa com persist (sem DAOs). Se funcionar, vai pros DAOs (pela main). Se não funcionar, é problema no DAO.

Num problema desse, quando não sei resolver, vou pegando do mais simples até o mais complexo, pra ver onde está o erro… Pode ser erro com o servidor, com o driver do banco (aliás, qual SGDB você está usando?)… Acho que o problema, nesse caso, poderá ser mais de baixo nível (pela parte do BatchUpdateExpt…), mas vamos com calma. Teste o que falei e poste os resultados…

Abraço!

R

@Andre

Não estou usando JBoss.
Os DAO’s estão funcionando pesquisas, inserções, coisas com persist,…

O problema é que ele acontece ÁS VEZES.Fui verificar, e vi que enquanto está esse erro mesmo se eu se for no phpMyAdmin e tentar excluir diretamente do banco de dados não conseguirei, dará o mesmo erro.Eu reinicio o tomcat e funciona normalmente pelo sistema (não tentei fazer diretamente pelo banco, não sei se este teria influência da reinicialização, mas como funcionou pelo sistema, acho que sim).

Por isso que acho que o erro seja no Dao, que eu deixo uma linha em uso no banco de dados, ou algo relacionado com isso.O problema é que esse é um erro esporádico não consigo simular esse erro com muita frequencia para realizar os testes necessários…

Vou tentar forçar esse erro para ver se consigo descobrir mais sobre ele.

JonathanSSantos

o teu erro e’ especifico de uma execucao de busca ou acontece de vez enqdo em qlqer tipo de transacao com o banco de dados?

qual banco tu estas utilizando?

qual a quantidade de informacoes que trafegam qdo da esse erro?!

R

@Jonathan

Banco = MYSQL
Quantidade de informações não é grande, por isso acho que seja algum erro meu.

Se o erro é específico ou acontece de vez em quando, também não sei isso que estou verificando agora com testes, daqui a pouco posso saber mais certo onde está o erro… Mas acho que são em ações específicas, estou procurando elas para ver o que posso fazer para arrumar.

JonathanSSantos

QUalquer coisa poste seu metodo do dao para ver ele e verificar se possa estar fazendo algo errado nele! :smiley:

Criado 21 de dezembro de 2009
Ultima resposta 22 de dez. de 2009
Respostas 8
Participantes 4