Pool C3P0 com Hibernate

8 respostas
A

Olá pessoal,

estou usando o pool C3P0 com Hibernate e tenho a seguinte configuração de pool para testes:

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <property name="hibernate.c3p0.timeout">3</property> <property name="hibernate.c3p0.max_statements">0</property> <property name="hibernate.c3p0.acquire_increment">2</property> <property name="hibernate.c3p0.idle_test_period">2</property> <property name="hibernate.c3p0.validate">true</property> <property name="hibernate.c3p0.min_size">3</property> <property name="hibernate.c3p0.max_size">4</property>

Ao subir a aplicação no servidor e fazer acesso as páginas abrem 1, 2 as vezes 3 conexões no banco de dados. (vejo pelo PgAdmin). Depois de milisegundos elas ficam idle.

Ao fazer mais acessos às páginas mais conexões são abertas. As idle não deveriam ser usadas ??

E por que as conexões nunca fecham ??

obs.: ambiente de desenvolvimento:
windows xp + Postgresql 8.3 + pgAdmin + eclipse + TomCat v6.0 + vraptor 3 (com criação de session via injeção)

Obrigado,
Abçs

8 Respostas

xdraculax

Cara, a idéia de usar um pool é exatamente para reutilizar conexões por horas sem ter que ficar criando novas conexões a cada nova necessidade de se comunicar com o banco.

No c3p0 as conexões são retiradas do pool somente por 2 motivos:

-Não passou no teste que ele faz nas conexões de tempos em tempos (dá um getTables() nos metadados da Connection);
-Ou a conexão ultrapssou o maxIdleTime;

Se você não configurá-lo, as conexões vão ficar lá, as mesmas, só irão sair se por algum motivo ficarem “bugadas”.

Aumente o número de conexões do seu pool para uns 8 … 10, e veja se ele se mantem sempre com essas conexões.

batista.gerson

Desculpa ta voltando num topico q ja ta a um bom tempo
ms asdias vc conseguiu resolver esse problema, ta acontecendo
o mesmo na minha aplicação eu nao sei como resolver. Abraço

Paulo_Silveira

Ola Asdias e Batista

Primeiramente uma sugestao, esse test period e o timeout estao baixissimos. Recomendo um timeout de 20 segundos e um idle test period de 30 segundos no minimo.

Voces estao fechando a session no interceptador? Se voces nao fecharem a session, o hibernate nao vai soltar a conexao, e ai o pool so vai usar novamente essa conexao depois do timeout estourar.

abracos

batista.gerson

Silveira no meu caso é uma aplicação desktop, eu faço o seguinte crio o DAO e chamo o metodo quando aceso a aplicação. Exemplo pra consultar o usuario.

public Usuario consultaUsuario(String login) throws SQLException {
        EntityManager entityManager = null;
        try {
            entityManager = factory.createEntityManager();
            Query qry = entityManager.createQuery("select u from Usuario u where u.login = :param1 and exclusao is false and    situaUsuario = 'A'");
            qry.setParameter("param1", login);
            return (Usuario) qry.getSingleResult();
        } finally {
            entityManager.close();
        }
    }

e quando eu acesso chamo o metodo, fiz as mudanças que vc sugueriu, mas continua abrindo 1, 2 as vezes 3 conexões .

Paulo_Silveira

Gerson, pode postar sua configuracao pra gente?

O teste que voce esta fazendo e invocar o metodo algumas vezes, só isso, correto?

De 3 conexoes ele nao passa?

R

Uma dica que eu dou para terem a certeza de que o pool está liberando as conexões.É utilizar o HeidiSQL ou no próprio PhpMyAdmin, vai haver um local para visualizar os processos e o tempo que eles estão executando.Assim você terá certeza que foi liberada e conseguirá entender muito melhor esse processo.

OBS: Fiquei com um problema de leak nas conexões durante uns 15 dias quando aprendi a olhar os processos me ajudou demais para entender o funcionamento do pool e resolver o problema.

batista.gerson

RafaelViana fiquei observando no pgMyAdmin e quando ele cria essa conexao depois elas entram num estado de idle. Normal isso, msm eu so usando pra fazer um select e mais nada.

xdraculax

RafaelViana:
Uma dica que eu dou para terem a certeza de que o pool está liberando as conexões.É utilizar o HeidiSQL ou no próprio PhpMyAdmin, vai haver um local para visualizar os processos e o tempo que eles estão executando.Assim você terá certeza que foi liberada e conseguirá entender muito melhor esse processo.

OBS: Fiquei com um problema de leak nas conexões durante uns 15 dias quando aprendi a olhar os processos me ajudou demais para entender o funcionamento do pool e resolver o problema.

Mas a conexão é retornada para o Pool quando você dá um close()… então é só garantir que um close() é chamado no Connection não?

Criado 29 de janeiro de 2010
Ultima resposta 12 de abr. de 2010
Respostas 8
Participantes 5