Problemas no hibernate após um certo numero de acessos

Olá pessoal, estou trabalhando com hibernate, fiz a minha aplicação e todos os testes aconteceram normalmente, no entanto, quando coloquei a aplicação em ambiente de produção (onde há um volume de testes muito maior) a aplicação após um tempo parava de se conectar ao banco, de forma que qualquer consulta que eu faça é lançada a seguinte exceção:

[WARN] JDBCExceptionReporter - -SQL Error: 17002, SQLState: null [ERROR] JDBCExceptionReporter - -Io exception: Connection reset by peer: JVM_recv in socket input stream read [WARN] JDBCExceptionReporter - -SQL Error: 17002, SQLState: null [ERROR] JDBCExceptionReporter - -Io exception: Connection reset by peer: JVM_recv in socket input stream read [ERROR] JDBCExceptionReporter - -Could not execute query <java.sql.SQLException: Io exception: Connection reset by peer: JVM_recv in socket input stream read>java.sql.SQLException: Io exception: Connection reset by peer: JVM_recv in socket input stream read at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:210) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:323) at oracle.jdbc.driver.OracleStatement.<init>(OracleStatement.java:417) at oracle.jdbc.driver.OracleStatement.<init>(OracleStatement.java:432) at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:182) at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:165) at oracle.jdbc.driver.OracleConnection.privatePrepareStatement(OracleConnection.java:604) at oracle.jdbc.driver.OracleConnection.prepareStatement(OracleConnection.java:485) at net.sf.hibernate.impl.BatcherImpl.getPreparedStatement(BatcherImpl.java:249) at net.sf.hibernate.impl.BatcherImpl.getPreparedStatement(BatcherImpl.java:223) at net.sf.hibernate.impl.BatcherImpl.prepareQueryStatement(BatcherImpl.java:65) at net.sf.hibernate.loader.Loader.prepareQueryStatement(Loader.java:704) at net.sf.hibernate.loader.Loader.doQuery(Loader.java:185) at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:133) at net.sf.hibernate.loader.Loader.doList(Loader.java:955) at net.sf.hibernate.loader.Loader.list(Loader.java:946) at net.sf.hibernate.hql.QueryTranslator.list(QueryTranslator.java:834) at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1536) at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1513) at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1505) at com.guiacultural.dao.hibernate.BaseHibernateDAO.find(BaseHibernateDAO.java:33) at com.guiacultural.dao.RegionalDAO.find(RegionalDAO.java:36)

O banco não caiu, somente esta aplicação é que pára de se conectar com o banco, o meu método find() onde eu faço a consulta no banco é o seguinte:

protected List find(String sql) throws Exception { Session session = null; Transaction tx = null; List result = null; try{ session = HibernateSessionFactory.openSession(); tx = session.beginTransaction(); result = session.find(sql); tx.commit(); }catch(HibernateException he){ if(tx!=null) tx.rollback(); throw he; } finally{ HibernateSessionFactory.closeSession(); } return result; }

Na classe HibernateSessionFactory eu implemento um singleton onde o atributo sessionFactory é construído, além também de ter o session como sendo um ThreadLocal.
Enfim, não conheço muito o padrão ThreadLocal (eu o implementei com base nas classes que vi na propria pagina do hibernate) mas o que eu imagino é que após um certo numero de consultas o meu ThreadLocal (session) esteja travando a aplicação para o acesso ao banco, não sei se é isso, também não configurei o hibernate para usar pool de conexões, ou seja, não imagino muito bem o que possa ser, mas penso também que seja alguma configuração mal feita, espero que alguem me ajude. O meu arquivo de configuração do hibernate (hibernate.cfg.xml) consta somente com as propriedade basicas: driver_class, url, username, password, dialect e a referencia aos *.hbm.xml

Desde já agradeço a atenção de todos

Amigou estou como o mesmo problema conseguiu alguma solução?

Esse post é de 2004. Acho difícil o cara lembrar a solução :slight_smile:

Mas pelo problema dele me parece que a conexão remota está caindo. A primeira suspeita seria configurar o pool para verificar se as conexões estão ativas antes de utiliza-las. Normalmente o padrão é usar as conexões sem verificar.

Quando você configura um datasource PostgreSQL no JBoss 7.x por exemplo, isso pode ser feito por meio da tag abaixo (cada servidor faz da sua maneira):

<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"/>

rodigo,

O meu problema justamente tenho isso tenho picos de energia nos servidores e quando isso acontece meu servidor de banco reinicia e a aplicação que esta em outro servidor não consegue conectar novamente. Ou seja com o uso desta tag ela ira refazer a conexão em caso de erro?

Mais ou menos isso sim.

Por padrão, as conexões que estão no pool não são verificadas antes de serem usadas. Acaba que em uma situação como essa que você descreveu, a conexão foi invalidada já que o banco caiu, então ela não serve mais pra nada :slight_smile:

A tag que eu mostrei acima faz com que o servidor antes de entregar a conexão a aplicação, verifique se ela ainda está ativa. Só lembrando que cada servidor/pool tem uma maneira diferente de fazer esse tipo de configuração.