Perdendo a Conexão com Banco de Dados

Blz pessoa.
Desenvolvi um sistema utilizando Java, Hibernate, Primefaces e banco de dados MySql e estou encontrando um problema que acredito tratar-se de timeout. Vamos imaginar a seguinte situação.
Usuário do sistema faz login no sistema de manhã, depois sai e volta a se logar somente depois de 2 ou 3 horas.
Quando essa situação acontece o servidor gera no console o erro abaixo.
Caused by: org.hibernate.exception.JDBCConnectionException: could not prepare statement
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:65) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:196) at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:160) at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1885) at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862) at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839) at org.hibernate.loader.Loader.doQuery(Loader.java:910) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355) at org.hibernate.loader.Loader.doList(Loader.java:2554) at org.hibernate.loader.Loader.doList(Loader.java:2540) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370) at org.hibernate.loader.Loader.list(Loader.java:2365) at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:126) at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1718) at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380) at org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java:402) at br.com.tcagro.dao.UsuarioDAO.autenticaUsuario(UsuarioDAO.java:26) at br.com.tcagro.bean.LoginBean.autenticar(LoginBean.java:72) at sun.reflect.GeneratedMethodAccessor1023.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.el.parser.AstValue.invoke(AstValue.java:247) … 36 more Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. at sun.reflect.GeneratedConstructorAccessor186.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) at com.mysql.jdbc.Util.getInstance(Util.java:408) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860) at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1187) at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1182) at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4071) at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4040) at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:162) at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:186) … 56 more Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Tenho impressão que se trata de um erro de timeout.
Utilizo o C3p0 para gerenciar minha conexões que esta configurado da seguinte maneira.

<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">1800</property>
<property name="hibernate.c3p0.validationQuery">SELECT 1</property>
<property name="hibernate.c3p0.acquire_increment">5</property>

Vocês acham que pode ser um erro de configuração ?

Você está devolvendo a conexão pro pool após a utilização?

Edit: Esqueci que você está usando Hibernate, ele deveria fazer isso sozinho.

Não deixe a conexão aberta eternamente. Abra e feche a conexão a cada requisição do usuário.

Eu analisei meus DAOs e toda vez que abro a conexão estou fazendo o fechamento no finally.
Olha um exemplo como os DAOs foram desenvolvidos.

	public void salvar(Entidade entidade){
	Session sessao = HibernateUtil.getFabricaDeSessoes().openSession();
	Transaction transacao = null;
	try{
		transacao = sessao.beginTransaction();
		sessao.save(entidade);
		transacao.commit();
	}catch(RuntimeException erro){
		if (transacao != null){
			transacao.rollback();
		}
		throw erro;
	}finally{
		sessao.close();
	}
}

Posta o código do arquivo ConnectionImpl.java

Cara me desculpa a ignorância, mas como pego esta código?
Ele não faz parte do pacote jdbc.connect ?

Tem razão, achei que fosse um código seu. Já que o stack trace do java nao ta ajudando, tente logar os pontos que isso poderia acontecer. Lembre-se também que se estiver acessando um objeto gerenciado pelo hibernate fora desse DAO, o mesmo pode falhar após fechar a session.

Então na verdade o erro ja acontece no login ao sistema. Nem acessa o banco de dados.

Então teria que analisar esse código que faz o login.