Falae gente,
to com uma coisa que tá me perturbando há muito tempo.
Tenho uma aplicação web deployada. Logo após o deploy, a conexão(via hibernate) com o MySQL funciona numa boa. Depois de um tempo que ela está inativa. A Conexão meio que se quebra e nem com autoReconnectForPools=true ou autoReconnect=true na String de conexão funciona!
Não to usando datasources agora, mas tentei por datasource no Glassfish e tive o mesmo erro.
package package
import org.hibernate.Session;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil
{
private static final SessionFactory sessionFactory;
static
{
sessionFactory = new Configuration().configure("hibernate.cfg.xml")
.buildSessionFactory();
}
public static Session getSession()
{
try
{
return sessionFactory.getCurrentSession();
// Recupera ou cria uma nova sessão. Caso a
// transação tenha sofrido um commit ou rollback,
// a sessão terá sido fechada. Neste caso uma
// nova sessão será criada. Caso contrário, a
// sessão corrente será recuperada.
}
catch (HibernateException e)
{
throw new InfraestruturaException(e);
}
}
public static void beginTransaction()
{
try
{
getSession().beginTransaction();
// Cria ou recupera a transação corrente,
// caso ela não tenha sofrido commit nem
// rollback.
}
catch (HibernateException e)
{
throw new InfraestruturaException(e);
}
}
public static void commitTransaction()
{
try
{
getSession().getTransaction().commit();
// Efetua o commit da transacao e fecha a sessão.
}
catch (HibernateException ex)
{
rollbackTransaction();
throw new InfraestruturaException(ex);
}
}
public static void rollbackTransaction()
{
try
{
getSession().getTransaction().rollback();
// Efetua o rollback da transacao e fecha a sessão.
}
catch (HibernateException ex)
{
throw new InfraestruturaException(ex);
}
}
}
parte do stacktrace do erro
23:33:35,234 INFO [STDOUT] 28/08/2008 23:33:35-org.hibernate.util.JDBCExceptionReporter logExceptions
ERROR: Communications link failure
Last packet sent to the server was 37843 ms ago.
23:33:35,250 INFO [STDOUT] 28/08/2008 23:33:35-org.hibernate.transaction.JDBCTransaction rollback
ERROR: JDBC rollback failed
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:980)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
.
.
.
23:33:35,250 INFO [STDOUT] Error: org.hibernate.exception.JDBCConnectionException: could not execute query
[quote=Willenjs]Falae gente,
to com uma coisa que tá me perturbando há muito tempo.
Tenho uma aplicação web deployada. Logo após o deploy, a conexão(via hibernate) com o MySQL funciona numa boa. Depois de um tempo que ela está inativa. A Conexão meio que se quebra e nem com autoReconnectForPools=true ou autoReconnect=true na String de conexão funciona!
Não to usando datasources agora, mas tentei por datasource no Glassfish e tive o mesmo erro.
package package
import org.hibernate.Session;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil
{
private static final SessionFactory sessionFactory;
static
{
sessionFactory = new Configuration().configure("hibernate.cfg.xml")
.buildSessionFactory();
}
public static Session getSession()
{
try
{
return sessionFactory.getCurrentSession();
// Recupera ou cria uma nova sessão. Caso a
// transação tenha sofrido um commit ou rollback,
// a sessão terá sido fechada. Neste caso uma
// nova sessão será criada. Caso contrário, a
// sessão corrente será recuperada.
}
catch (HibernateException e)
{
throw new InfraestruturaException(e);
}
}
public static void beginTransaction()
{
try
{
getSession().beginTransaction();
// Cria ou recupera a transação corrente,
// caso ela não tenha sofrido commit nem
// rollback.
}
catch (HibernateException e)
{
throw new InfraestruturaException(e);
}
}
public static void commitTransaction()
{
try
{
getSession().getTransaction().commit();
// Efetua o commit da transacao e fecha a sessão.
}
catch (HibernateException ex)
{
rollbackTransaction();
throw new InfraestruturaException(ex);
}
}
public static void rollbackTransaction()
{
try
{
getSession().getTransaction().rollback();
// Efetua o rollback da transacao e fecha a sessão.
}
catch (HibernateException ex)
{
throw new InfraestruturaException(ex);
}
}
}
parte do stacktrace do erro
23:33:35,234 INFO [STDOUT] 28/08/2008 23:33:35-org.hibernate.util.JDBCExceptionReporter logExceptions
ERROR: Communications link failure
Last packet sent to the server was 37843 ms ago.
23:33:35,250 INFO [STDOUT] 28/08/2008 23:33:35-org.hibernate.transaction.JDBCTransaction rollback
ERROR: JDBC rollback failed
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:980)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
.
.
.
23:33:35,250 INFO [STDOUT] Error: org.hibernate.exception.JDBCConnectionException: could not execute query
Por favor, ajuda! não sei mais o que fazer… [/quote]
Mas procurando muito e muito na internet a grande solução foi aumentar alguma configuração de tempo de ‘timeout’.
Muita gente falava sobre problema se passar depois de uma noite ou um fim de semana e o sistema ficava sem uso. Se for o mesmo caso seu, tenta aumentar o timeout para algo maior que o período de inatividade previsto. Depois de quase 5 anos eu não me lembro, mas tentaria a hibernate.c3p0.timeout .