使用JPA和Hibernate在Persistence.xml中配置C3P0 [英] Configuring C3P0 in Persistence.xml with JPA and Hibernate
问题描述
好吧,我正在尝试首次使用JPA + Hibernate + Spring配置C3P0。在persistence.xml中,我有:
Well, i'm trying to configure for first time the C3P0 with JPA + Hibernate + Spring. In persistence.xml i have:
<properties>
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.cache.use_second_level_cache"
value="false" />
<property name="hibernate.cache.use_query_cache" value="false" />
<property name="hibernate.jdbc.batch_size" value="50" />
<!-- Important -->
<property name="hibernate.connection.provider_class"
value="org.hibernate.connection.C3P0ConnectionProvider" />
<property name="hibernate.c3p0.max_size" value="20" />
<property name="hibernate.c3p0.min_size" value="5" />
<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="300" />
</properties>
但是当我尝试初始化tomcat时,我收到以下错误:
But when i try to initialize the tomcat, i got the following error:
Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)
... 58 more
50570 [Thread-4] ERROR org.hibernate.tool.hbm2ddl.SchemaUpdate - could not complete schema update
java.sql.SQLException: Connections could not be acquired from the underlying database!
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529)
编辑1:
这是我的applicationContext。 xml,如何配置C3P0?
This is my applicationContext.xml, how can i configure C3P0 inside this ?
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- Seta anotaçoes para serem usadas pelo Spring -->
<context:annotation-config />
<!-- Define o pacote onde o Spring vai procurar por beans anotados -->
<context:component-scan base-package="br.com.myapp" />
<!-- define que as transaçoes irao ser anotadas -->
<tx:annotation-driven proxy-target-class="true" />
<!-- Configuracao do Banco de Dados -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql://localhost/mydatabase" />
<property name="username" value="postgres" />
<property name="password" value="pgadmin" />
</bean>
<!-- Configuracao do Hibernate -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="senderPU" />
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="showSql" value="true" />
</bean>
</property>
</bean>
<!-- Configuracao do gerente de transacoes do Spring -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
</beans>
推荐答案
您的配置存在缺陷。您正在应用程序上下文中配置 DataSource
。所以基本上所有 hibernate.c3po
属性都没用,旁边是 hibernate.connection.provider_class
属性的设置你的申请。 C3P0ConnectionProvider
需要C3P0连接,但是你使用的是基本 DriverManagerDataSource
。
Your configuration is flawed. You are configuring the DataSource
in the application context. So basically all hibernate.c3po
properties are useless, next to that the setting of the hibernate.connection.provider_class
property breaks your application. The C3P0ConnectionProvider
expects a C3P0 Connection however you are using a basic DriverManagerDataSource
.
我建议不要试图让hibernate来管理池,只需在你的applicationcontext中配置它。用以下内容替换数据源定义
I would suggest instead of trying to get hibernate to manage the pool simply configure it inside your applicationcontext. Replace your datasource definition with the following
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<!-- Connection properties -->
<property name="driverClass" value="org.postgresql.Driver" />
<property name="jdbcUrl" value="jdbc:postgresql://localhost/mydatabase" />
<property name="user" value="postgres" />
<property name="password" value="pgadmin" />
<!-- Pool properties -->
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="20" />
<property name="acquireIncrement" value="1" />
<property name="maxStatements" value="50" />
<property name="idleConnectionTestPeriod" value="3000" />
<property name="loginTimeout" value="300" />
</bean>
并删除 hibernate.c3p0
和<来自persistence.xml的code> hibernate.connection.provider_class 。将配置移动到Spring的优点是,您可以使用属性文件来包含属性,并将它们替换为 PropertyPlaceHolderConfigurer
,而不是在persistence.xml中修复它们
And remove the hibernate.c3p0
and hibernate.connection.provider_class
from your persistence.xml. Added advantage of moving the configuration to Spring is that you could use a properties file to contain your properties and have them replaced by a PropertyPlaceHolderConfigurer
instead of having them fixed in your persistence.xml
基本上,您可以从persistence.xml中删除所有属性,并将它们移动到基于弹簧的配置。
Basically you could remove all your properties from the persistence.xml and move them to the spring based configuration.
2个其他非相关建议。您可以删除< context:component-scan /> $隐含的
< context:annotation-config />
C $ C>。建议在标题中使用无版本的xsd文件,因此我建议删除版本。
2 other, non, related suggestions. You can remove <context:annotation-config />
that is already implied by <context:component-scan />
. It is recommended to use versionless xsd files in your header, so I would suggest removing the versions.
这篇关于使用JPA和Hibernate在Persistence.xml中配置C3P0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!