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.