[vraptor3] Conexão com o banco perdida

Boa noite,

Estou com um problema que não consigo resolver, meu projeto está com Vraptor3 e estou usando o Hibernate e o banco Postgresql.

Quando a aplicação sobe, cria uma conexão com o banco e funciona tudo perfeitamente, mas se, por algum motivo, essa conexão é perdida (eu testo excluindo a conexão no próprio banco na tabela pg_stat_activity), o meu projeto não está identificando que a conexão foi perdida. Faço um session.isOpen() e retorna true.

Criei um interceptor que faz uma query simples (select 1 from tabela) apenas para testar a conexão e, assim consigo verificar que a conexão foi perdida, mas como faço para que a conexão seja recriada?

Seguem alguns códigos:

@Component
public class PersistenciaProcesso extends PersistenciaManager<Processo> implements PersistenciaProcessoDao {

    public PersistenciaProcesso(Session session) {
	super(session);
    }
}
@Component
public abstract class PersistenciaManager<T> {

    protected Session session;
    private Class<T> entityBeanType;

    public PersistenciaManager(Session session) {
	this.session = session;
	initializer();
    }

    @SuppressWarnings("unchecked")
    private void initializer() {
	ParameterizedTypeImpl paramGenerics = (ParameterizedTypeImpl) getClass().getGenericSuperclass();
	entityBeanType = (Class<T>) paramGenerics.getActualTypeArguments()[0];
    }
}

Abs,
Renato.

Use um connection pool que vai ter o papel de criar connections e entregá-las para você.

O Hibernate tem o c3p0… Precisa baixar um jar dele e ver as configurações que você vai colocar.

Rafael,

Obrigado pela resposta, mas adicionando o c3p0 o problema continua o mesmo.

Adicionei a classe no meu \lib e o meu xml está assim:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
		<property name="hibernate.connection.url">jdbc:postgresql://x.x.x.x:5432/schema</property>
		<property name="hibernate.connection.username">usuario</property>
		<property name="hibernate.connection.password">senha</property>
		<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
		<property name="show_sql">true</property>

		<property name="hibernate.c3p0.min_size">5</property>
		<property name="hibernate.c3p0.max_size">20</property>
		<property name="hibernate.c3p0.timeout">300</property>
		<property name="hibernate.c3p0.max_statements">50</property>
		<property name="hibernate.c3p0.idle_test_period">3000</property>

		<mapping class="br.com.pacote.Processo" />
	</session-factory>
</hibernate-configuration>

Estou fazendo algo errado???

Rafael,

adicionei a linha abaixo:

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

Agora quando eu mato as conexões e tento acessar, ele dá erro, mas quando tento da segunda vez ele recria uma conexão para mim, este é o comportamento normal?

Abs,
Renato

Você está matando as conexões só para testes?

Pois o c3p0 vai cuidar disso para você, quando elas atingirem o timeout, ele vai recriá-las para você.

Bom dia,

Isso mesmo, estou matando para testar. Como as conexões estavam se perdendo, forcei este teste para saber como seria o comportamento!

Muito obrigado pela ajuda.

Abs,
Renato.