1
resposta

Estatísticas do Pool de conexão

Pessoal,

Gostaria de saber como obter a informação o pool de conexões?

O contexto é o seguinte:

Alterei o peristence.xml do projeto Livraria do curso para utilizar Java_e_JSF_I_Sua_aplicação_web_com_JSF2 para utilizar o pool de conexões do c3p0 e habilitei o statistics do hibernate.

<persistence-unit name="livraria" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <class>br.com.caelum.testePoolCpHibV.modelo.Livro</class>
        <class>br.com.caelum.testePoolCpHibV.modelo.Autor</class>
        <class>br.com.caelum.testePoolCpHibV.modelo.Usuario</class>

        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/livrariadb" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="msid" />

            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
            <property name="hibernate.generate_statistics" value="true"/>  

            <property name="hibernate.connection.provider_class" value="org.hibernate.c3p0.internal.C3P0ConnectionProvider"/>
            <property name="hibernate.c3p0.min_size" value="10" />
            <property name="hibernate.c3p0.max_size" value="10" />
            <property name="hibernate.c3p0.acquire_increment" value="1" />
            <property name="hibernate.c3p0.idle_test_period" value="3000" />
            <property name="hibernate.c3p0.max_statements" value="50" />
            <property name="hibernate.c3p0.timeout" value="1800" />

        </properties>
    </persistence-unit>

Para obter informações das conexões criei os métodos abaixo na classe JPAUtil.

    public static Statistics getStatistics(EntityManager em){
        Session session = (Session) em.getDelegate();
        SessionFactory sf = session.getSessionFactory();
        Statistics stats = sf.getStatistics();
        return stats;
    }

    public void logStatistics(EntityManager em) {
        Statistics stats = getStatistics(em);
        System.out.println("Número de conexões: " + stats.getConnectCount());
        System.out.println("Número de conexões abertas: " + stats.getSessionOpenCount());
        System.out.println("Número de conexões fechadas: " + stats.getSessionCloseCount());

    }

Entretanto, não consigo identificar se o pool está realmente funcionando. As informações acimas somente estão associadas ao EM e não ao pool.

Sendo assim, gostaria de saber como monitorar a utilização do Pool de conexões, mostrar quantas conexões estão abertas no pool. Alguém saberia como fazer?

1 resposta

Acho que o jeito mais simples é você abrir o console do seu banco de dados, por exemplo o mysql e verificar quantas conexões estão sendo usadas em determinado momento da sua aplicação.

Pensando na aplicação, acho que você teria que cair para o uso do C3P0 na mão, pq é ele que controla o número de conexões abertas e não o hibernate. O hibernate só delega a chamada :(.