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
