Bom dia!
Estou utilizando hibernate para minha aplicação, e gostaria de saber como faço para manter minha conexão com banco de dados sempre ativa? Ocorre que quando o sistema fica muito tempo sem requisições ela fica inativa… algo assim…
Obrigado…
Bom dia!
Estou utilizando hibernate para minha aplicação, e gostaria de saber como faço para manter minha conexão com banco de dados sempre ativa? Ocorre que quando o sistema fica muito tempo sem requisições ela fica inativa… algo assim…
Obrigado…
broken pipe ?
time out ?
eu solucionei assim, criei uma classe auxiliar chamada HibernateUtils.... e envolvi minha factory de session assim:
EntityManager em = HibernateUtils.reconnectIfNeed(factory.createEntityManager()); //no caso de JPA
Session session = HibernateUtils.reconnectIfNeed(factory.openSession()); //no caso de SessionFactory
o problema se dava pq o hibernate não checa a conexão quando devolve uma factory, então eu faço o check via JDBC, então factorys no poll
são sempre devolvidas com um check antes, e a conexão é reestabelecida se necessario.
package br.com.tomazlavieri.persistence;
import java.sql.SQLException;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.ejb.HibernateEntityManager;
public class HibernateUtils {
private static final Logger logger = Logger.getLogger(HibernateUtils.class);
public static EntityManager reconnectIfNeed(EntityManager entityManager) {
if (entityManager instanceof HibernateEntityManager) {
Session session = ((HibernateEntityManager)entityManager).getSession();
reconnectIfNeed(session);
}
return entityManager;
}
@SuppressWarnings("deprecation")
public static Session reconnectIfNeed(Session session) {
try {
if (!session.connection().isValid(1)) {
session.reconnect(null);
logger.warn("connection was lost, reconnect was made");
}
} catch (SQLException ex) {
logger.error("fail trying to reconnect to database", ex);
throw new PersistenceException("fail trying to reconnect to database",ex);
}
return session;
}
public static org.hibernate.classic.Session reconnectIfNeed(org.hibernate.classic.Session session) {
return (org.hibernate.classic.Session)reconnectIfNeed((Session)session);
}
}
Bom dia!Estou utilizando hibernate para minha aplicação, e gostaria de saber como faço para manter minha conexão com banco de dados sempre ativa? Ocorre que quando o sistema fica muito tempo sem requisições ela fica inativa… algo assim…
Obrigado…
Há a possibilidade de criar-se um connection pool, o que é melhor pois não degrada a performance do servidor e nem da aplicação. Isso fica por conta do conteiner gerenciar (abrir, fechar etc…)
Lavieri, obrigado pela dica… Só tenho um problema…
Ao conectar, a sua classe HibernateUtils executa uma validação:
if (!session.connection().isValid(1)) {
Esta validação traz o seguinte erro:
java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z
Ela é necessária, não seria isClosed??? Obrigado
dahenz, uma outra sugestão é usar um connection pool, pois ele controla de forma transparente tudo. E você ainda pode configurar um monte de coisinhas.
Em um projeto meu o banco de dados estava muito instável, então enquanto a reinstalação não era possível eu pedia ao connection polling para testar a conexão antes de me entregar, assim se desse algum problema ele reconectava automaticamente.
A solução do Lavieri é muito boa, principalmente se você por alguma razão não puder usar datasources.
Abraços
Lavieri, obrigado pela dica… Só tenho um problema…Ao conectar, a sua classe HibernateUtils executa uma validação:
if (!session.connection().isValid(1)) {Esta validação traz o seguinte erro:
java.lang.AbstractMethodError:
com.mysql.jdbc.Connection.isValid(I)ZEla é necessária, não seria isClosed??? Obrigado
dahenz, verifique a versão do seu driver JDBC.
Garcia… BELEZA???
Deu certo aqui, coloquei um Driver mais atualizado…
Eu utilizo pool de conexões em JDBC mas em session nunca havia ouvido falar…
Vamos ver agora… hehe até amanhã eu descubro se deu certo!! haha
Valew Lavieri!!! Usei teu código aqui… abraço
Ola daian!
se voce usar o c3p0 (e eh bom usar com hibernate) voce pode configurar isso no hibernate.cfg.xml. é um parametro que ele checa as conexoes de X em X tempos, e ai acaba o tal do broken type, que acho que é o que voce esta recebendo!
abracos
nao precisao mecher nada em codigo
configura o c3p3 no seu hibernate
ele vai gerenciar isso pra você, se caso ficar inativo, ou o banco cair, ele renocta pra você
Hum Paulo… A configuração do c3p0 se dá somente pelo arquivo hibernate.cfg.xml??? Pois não tenho esse arquivo…
Obrigado pele dica!
Oi Daian!
Pode ser pelo properties tambem!
https://www.hibernate.org/214.html
A configuracao é essa:
100
Ou pelo spring, ou ate programaticamente!
Ola daian!se voce usar o c3p0 (e eh bom usar com hibernate) voce pode configurar isso no hibernate.cfg.xml. é um parametro que ele checa as conexoes de X em X tempos, e ai acaba o tal do broken type, que acho que é o que voce esta recebendo!
abracos
Mas não funciona muito bem. Comigo acontece quando uso o MySQL. E se usam aqui, então também não funciona, porque acontece o mesmo.
Alguém com alguma solução Ninja?
Ola daian!se voce usar o c3p0 (e eh bom usar com hibernate) voce pode configurar isso no hibernate.cfg.xml. é um parametro que ele checa as conexoes de X em X tempos, e ai acaba o tal do broken type, que acho que é o que voce esta recebendo!
abracos
Broken Type ou Broken Pipe?
Lavieri, obrigado pela dica… Só tenho um problema…Ao conectar, a sua classe HibernateUtils executa uma validação:
if (!session.connection().isValid(1)) {Esta validação traz o seguinte erro:
java.lang.AbstractMethodError:
com.mysql.jdbc.Connection.isValid(I)ZEla é necessária, não seria isClosed??? Obrigado
Use o drive do mysql 5.1.x que vai funcionar…
uma vez usei o driver 5.0.x e deu esse mesmo erro que vc relatou
segue o drive que eu uso
=> http://rapidshare.com/files/293980457/mysql-connector-java-5.1.8-bin.jar
Oi Daian!Pode ser pelo properties tambem!
https://www.hibernate.org/214.htmlA configuracao é essa:
100Ou pelo spring, ou ate programaticamente!
por favor lê esse post => http://www.guj.com.br/posts/list/141603.java
eu tentei configura ro c3p0, e esse problema se transformou em outro, eu relato esse nesse post… que linkei … o c3p0 reseta caso 1 ou mais conexões cheguem ao tempo de intativade, porem curiosamente ele reseta não só a conexão que chegou a inatividade, ele reseta todas do pool, então quem estiver usando auma das conexão que não estava inativa no momento do reset do c3p0, recebe um broken pipe,
essa semana eu recebi uns 5 a 8 broken pipe aqui no GUJ