Como faço para manter uma conexão com banco de dados sempre ativa?

14 respostas
D

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…

14 Respostas

L

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.

segue o HiberanteUtils.java
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);
	}
}
T

dahenz:
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…)

D

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

G

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

G

dahenz:
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, verifique a versão do seu driver JDBC.

D

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

P

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

D

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ê

D

Hum Paulo… A configuração do c3p0 se dá somente pelo arquivo hibernate.cfg.xml??? Pois não tenho esse arquivo…

Obrigado pele dica!

P

Oi Daian!

Pode ser pelo properties tambem!
https://www.hibernate.org/214.html

A configuracao é essa:
100

Ou pelo spring, ou ate programaticamente!

D

Paulo Silveira:
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?

F

Paulo Silveira:
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?

L

dahenz:
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

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

L

Paulo Silveira:
Oi Daian!

Pode ser pelo properties tambem!
https://www.hibernate.org/214.html

A configuracao é essa:
100

Ou 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

Criado 16 de outubro de 2009
Ultima resposta 16 de out. de 2009
Respostas 14
Participantes 8