[RESOLVIDO] timeout no hibernate

Trabalho em uma aplicação web que está apresentado um erro de timeout. Há módulos da aplicação que fazem acesso ao banco via DAO (sql embutido no código) e há módulos que fazem acesso ao banco via Hibernate.

A exceção de timeout ocorre em uma classe Hibernate com o seguinte trecho de código:

try {
Session session = HibernateUtil.currentSession();
saida = session.save(entidade);
} catch (HibernateException e) {
log.error("Exception no sistema: ",e);
throw new SystemException(e);
}

Pelo que entendi, após o timeout, ocorre o erro ao chamar o método “save()” o objeto session.

Tentei 2 configurações para aumentar o tempo de timeout que não surtiram efeito:

  1. Configurei o DataSource do JBoss conforme abaixo:
jdbc/bancoDS jdbc:oracle:thin:@apolo:1521:apolo9i1 oracle.jdbc.driver.OracleDriver teste teste 5000 20 org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter Oracle9i
  <!-- sql to call on an existing pooled connection when it is obtained from pool - the OracleValidConnectionChecker is prefered -->
  <check-valid-connection-sql>SELECT SYSDATE FROM DUAL</check-valid-connection-sql>
  1. Configurei o hibernate.cfg.xml conforme abaixo:

     <property name="connection.datasource">java:/jdbc/bancoDS</property>
     <property name="dialect">org.hibernate.dialect.OracleDialect</property>
     <property name="show_sql">false</property>
     <property name="use_outer_join">true</property>
     <!--<property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>-->
     <property name="transaction.factory_class">
         org.hibernate.transaction.JTATransactionFactory
     </property>
     <!-- Esta propriedade é dependente do AppServer -->
     <property name="transaction.manager_lookup_class">
     	org.hibernate.transaction.JBossTransactionManagerLookup
     </property>
    
     <property name="hibernate.cache.provider_class">
     	org.hibernate.cache.EhCacheProvider
     </property>
    
     <!--  <property name="jta.UserTransaction">java:comp/ClientUserTransaction</property>-->
    <property name="hibernate.c3p0.timeout">1200</property>
    

Não sei se o fato da propriedade jtx.UserTransaction estar comentado pode causar problema.

Obs: depois que eu tentei essas configurações o timeout passou a acontecer mais rápido do que antes.

Alguém tem alguma idéia do pode ser?

Obrigado.

Rodrigo,

Esclarece aí pra gente… esse timeout ocorre em todos os métodos que usam Hibernate para persistência, ou é somente este método que vc mostrou?

Se está ocorrendo timeout para conectar é provável que o JBoss não esteja conseguindo acessar sua base oracle ou sua aplicação não está conseguindo acessar o servidor de aplicação.

Poste a exceção disparada aqui para gente analisar e ver se pode ajudar em alguma coisa.

PS: Quando postar código coloque este entre as tags [ code]…[/ code] para facilitar a leitura.

@braços,
Cleiton

Olá Cleiton!

O erro ocorre somente nesse método. Isso faz parte de um processo “pesado” de geração relatório em pdf.

A exceção é essa:

Caused by: org.hibernate.TransactionException: could not register synchronization with JTA TransactionManager
at org.hibernate.jdbc.JDBCContext.registerSynchronizationIfPossible(JDBCContext.java:187)
at org.hibernate.jdbc.JDBCContext.connectionOpened(JDBCContext.java:80)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:309)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:110)
at org.hibernate.jdbc.AbstractBatcher.prepareSelectStatement(AbstractBatcher.java:82)
at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:73)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:85)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:481)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:476)
at com.cpqd.assistec.mps.dao.hibernate.GenericDAOImpl.criar(GenericDAOImpl.java:37)
… 60 more
Caused by: javax.transaction.RollbackException: Already marked for rollback
at org.jboss.tm.TransactionImpl.registerSynchronization(TransactionImpl.java:717)
at org.hibernate.jdbc.JDBCContext.registerSynchronizationIfPossible(JDBCContext.java:176)
… 74 more

Obrigado.

Rodrigo.

Rodrigo,

Fiquei um pouco confuso…

1 - Pq tem que chamar o método save() ao processar relatórios?
2 - Você está salvando relatórios?
3 - Esse objeto entidade que é enviado como parametro para ser persistido do banco, do que se trata?
4 - Vc está salvando cada objeto entidade gerado como um item do relatório?

Pela exceção gerada parece-me que este teu objeto entidade não está completo, ou seja, tem alguma informação com restrição na base, tipo restrição de unicidade, not-null, etc. Por isso ele desfaz a transação.

Seria interessante vc colocar todo o printStackTrace() para gente ver e se possível sua rotina o parte dela para gente dar uma olhada, pois por esse trecho da exceção pode ser por vários motivos.

Seria interessante vc dar uma olhada na geração desse seu objeto entidade que vc está salvando se está sendo construído corretamente.

@braços,
Cleiton

O problema acontecia porque o Transaction Manager do JBoss estava configurado com o timeout default para transações (5 minutos) e a consulta demorava mais tempo que isso para retornar. Então o JBoss invalidava a transação e a marcava para rollback, depois o Oracle retornava a resposta e o JBoss não aceitava fazer a persistência porque o a transação já havia sido invalidada.
Para resolver alterei esse timeout no arquivo jboss-service.xml e otimizei a consulta.