Pool DBCP com Hibernate

Olá pessoal,

fiz uma aplicação com Hibernate.

Ao rodá-la o Hibernate usa um pool de conexões dele próprio, mas ele diz que não é para usar em produção.

Em seguida configurei para usar o pool C3P0 e funcionou corretamente. (o jar deste pool já vem com o Hibernate)

Depois configurei para usar o pool DBCP - que tem mais opções de configuração, mas não funcionou.

Abaixo parte do hibernate.conf.xml onde configuro o pool:

<property name="hibernate.dbcp.initialSize">10</property> <property name="hibernate.dbcp.validationQuery">select 1</property> <property name="hibernate.dbcp.defaultAutoCommit">false</property> <property name="hibernate.dbcp.maxActive">20</property> <property name="hibernate.dbcp.maxIdle">5</property> <property name="hibernate.dbcp.minIdle">1</property> <property name="hibernate.dbcp.maxWait">30000</property> <property name="hibernate.dbcp.testOnBorrow">false</property> <property name="hibernate.dbcp.poolPreparedStatements">true</property> <property name="hibernate.dbcp.removeAbandoned">false</property>

No log ao executar a aplicação aparece sempre “USING HIBERNATE BUILT-IN CONNECTION POOL”, que significa que o DBCP não foi achado

16:01:42,937 INFO DriverManagerConnectionProvider:41 - USING HIBERNATE BUILT-IN CONNECTION POOL (not for production use!) 16:01:42,937 INFO DriverManagerConnectionProvider:42 - Hibernate connection pool size: 20 16:01:42,937 INFO DriverManagerConnectionProvider:45 - autocommit mode: false 16:01:42,953 INFO DriverManagerConnectionProvider:80 - using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost/fj26 16:01:42,968 INFO DriverManagerConnectionProvider:86 - connection properties: {user=root, password=****}

obs.: os jar’s do DBCP colocados no lib foram:

  • commons-dbcp-1.2.2.jar
  • commons-logging-1.0.4.jar
  • commons-collections-2.1.1.jar

Alguém sabe como fazer funcionar o DBCP ?? ou tem um Java Project simples usando DBCP ??

Obrigado,
Abs.

Não sei o motivo, mas já tive que incluir essa configuração para o hibernate reconhecer o pool c3p0

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

portanto, para seu caso acho que isso resolve

<property name="hibernate.connection.provider_class">org.hibernate.connection.DBCPConnectionProvider</property>

Fonte:
http://wiki.apache.org/commons/DBCP/Hibernate

Até

Olá,

tentei usar o provider “org.hibernate.connection.DBCPConnectionProvider”, mas não funcionou. Ao executar a aplicação dá ClassNotFoundException para DBCPConnectionProvider.

Ví na web muita gente com este problema e nenhuma solução.

Pesquisando mais a fundo achei no javadoc do Hibernate que o provider DBCP não foi implementado no Hibernate 3. (no 2 foi).

https://www.hibernate.org/hib_docs/v3/api/org/hibernate/connection/package-summary.html

No 3 somente os C3P0 e Proxool foram implementados.

O pior é que já vi Hibernate 3 usando DBCP em produção. Acho que era via dataSource.

Algum mais pode me dar uma luz ??

Abçs

Consegui fazer funcionar o pool DBCP no Hibernate 3.

A aplicação que eu citei que havia visto funcionando com pool DBCP + Hibernate 3 foi feita usando Spring.

E por acaso a aplicação que estou fazendo usa vRaptor3, que por sua vez utiliza como provider padrão de injeção de dependência o Spring.

Fiz isto:

  • criei no classpath de minha aplicação um applicationContext.xml, que passou a ser visto pelo vRaptor3 e nele criei um datasource. (transportei as configurações do meu hibernate.conf.xml para o applicationContext.xml)

[code]<?xml version="1.0" encoding="UTF-8"?>

      <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource">
  		  <!-- configuracao de connection db -->
		  <property name="driverClassName" value="org.postgresql.Driver" />
		  <property name="url" value="jdbc:postgresql://localhost:5432/bd_teste" />
                      <property name="username" value="desenv" />
                      <property name="password" value="desenv" />                       

		  <!-- configuracao do pool DBCP -->
                      <property name="initialSize" value="0" />
                      <property name="maxActive" value="3" />
                      <property name="maxIdle" value="2" />
                      <property name="minIdle" value="0" />
                      <property name="maxWait" value="-1" />
                      <property name="validationQuery" value="select 1" />
                      <property name="testOnBorrow" value="true" />
                      <property name="testOnReturn" value="false" />
                      <property name="testWhileIdle" value="false" />
                      <property name="timeBetweenEvictionRunsMillis" value="-1" />
                      <property name="numTestsPerEvictionRun" value="3" />
                      <property name="minEvictableIdleTimeMillis" value="1800000" /> <!--  30 * 60seg * 1000miliseg = 30min -->
	  </bean>

    <bean id="sessionFactory" 
          class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
          destroy-method="destroy">
          
		<property name="dataSource" ref="myDataSource" />
		<property name="hibernateProperties">
			<props>
				 <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
			     <prop key="hibernate.hibernate.show_sql">true</prop>
			     <prop key="hibernate.format_sql">true</prop>				
			</props>
		</property>					
		<property name="annotatedClasses">
			<list>
   				<value> ...nomes das classes com @Entity... </value>
			</list>
		</property>
	</bean>

[/code]

  • depois mudei a minha classe de criação de sessions para pegar o bean ‘sessionFactory’ do applicationContext.xml;
  • por fim, coloquei os jar’s da Apache e deletei o hibernate.conf.xml, que estava vazio.

O pool DBCP agora funciona.

Abçs

[quote=asdias]Consegui fazer funcionar o pool DBCP no Hibernate 3.

A aplicação que eu citei que havia visto funcionando com pool DBCP + Hibernate 3 foi feita usando Spring.

E por acaso a aplicação que estou fazendo usa vRaptor3, que por sua vez utiliza como provider padrão de injeção de dependência o Spring.

Fiz isto:

  • criei no classpath de minha aplicação um applicationContext.xml, que passou a ser visto pelo vRaptor3 e nele criei um datasource. (transportei as configurações do meu hibernate.conf.xml para o applicationContext.xml)

[code]<?xml version="1.0" encoding="UTF-8"?>

      <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource">
  		  <!-- configuracao de connection db -->
		  <property name="driverClassName" value="org.postgresql.Driver" />
		  <property name="url" value="jdbc:postgresql://localhost:5432/bd_teste" />
                      <property name="username" value="desenv" />
                      <property name="password" value="desenv" />                       

		  <!-- configuracao do pool DBCP -->
                      <property name="initialSize" value="0" />
                      <property name="maxActive" value="3" />
                      <property name="maxIdle" value="2" />
                      <property name="minIdle" value="0" />
                      <property name="maxWait" value="-1" />
                      <property name="validationQuery" value="select 1" />
                      <property name="testOnBorrow" value="true" />
                      <property name="testOnReturn" value="false" />
                      <property name="testWhileIdle" value="false" />
                      <property name="timeBetweenEvictionRunsMillis" value="-1" />
                      <property name="numTestsPerEvictionRun" value="3" />
                      <property name="minEvictableIdleTimeMillis" value="1800000" /> <!--  30 * 60seg * 1000miliseg = 30min -->
	  </bean>

    <bean id="sessionFactory" 
          class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
          destroy-method="destroy">
          
		<property name="dataSource" ref="myDataSource" />
		<property name="hibernateProperties">
			<props>
				 <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
			     <prop key="hibernate.hibernate.show_sql">true</prop>
			     <prop key="hibernate.format_sql">true</prop>				
			</props>
		</property>					
		<property name="annotatedClasses">
			<list>
   				<value> ...nomes das classes com @Entity... </value>
			</list>
		</property>
	</bean>

[/code]

  • depois mudei a minha classe de criação de sessions para pegar o bean ‘sessionFactory’ do applicationContext.xml;
  • por fim, coloquei os jar’s da Apache e deletei o hibernate.conf.xml, que estava vazio.

O pool DBCP agora funciona.

Abçs
[/quote]

Brother, nunca usei essa configuração e nem usei spring também… porém,e stou com um problema grande, não consigo por esses pools de conexão para funiconar…

já tentei c3p0, dbpc, pool do hibernate, etc… as conexões abrem e nunca fecham e as proximas abrem e também naõ fecham… já peguei mais de 20 sessoes abertas para um único usuário…

Tenho 2 dúdivas

Como faço para entregar a conexão ao hibernate, usando spring e como faço para trabalhar com usuário e senha dinamico ou se existe outra forma de capturar o usuário logado por fora do sistema, para então descobrir se ele esta fazendo algo que está pesando o banco ou algo do genero…