Pool DBCP com Hibernate

4 respostas
A

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.

4 Respostas

A

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é

A

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

A

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)

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

<beans xmlns="http://www.springframework.org/schema/beans"
	     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	     xsi:schemaLocation="http://www.springframework.org/schema/beans
	     	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
	            
          <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>
		
</beans>

- 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

R
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)

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

<beans xmlns="http://www.springframework.org/schema/beans"
	     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	     xsi:schemaLocation="http://www.springframework.org/schema/beans
	     	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
	            
          <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>
		
</beans>

- 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

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...

Criado 28 de janeiro de 2010
Ultima resposta 17 de nov. de 2010
Respostas 4
Participantes 3