gpt4 book ai didi

java - 使用 JPA 和 Hibernate 在 Persistence.xml 中配置 C3P0

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:39:03 26 4
gpt4 key购买 nike

好吧,我第一次尝试使用 JPA + Hibernate + Spring 配置 C3P0。在 persistence.xml 中我有:

<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 时,出现以下错误:

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?

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

我建议不要尝试让 hibernate 来管理池,只需在您的应用程序上下文中配置它即可。用以下内容替换您的数据源定义

<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.c3p0hibernate.connection.provider_class来自你的 persistence.xml。将配置移动到 Spring 的另一个好处是您可以使用属性文件来包含您的属性并将它们替换为 PropertyPlaceHolderConfigurer而不是将它们固定在您的 persistence.xml 中

基本上,您可以从 persistence.xml 中删除所有属性,并将它们移动到基于 spring 的配置中。

2 其他非相关建议。您可以删除 <context:annotation-config /> <context:component-scan /> 已经暗示了这一点.建议在 header 中使用无版本的 xsd 文件,因此我建议删除版本。

关于java - 使用 JPA 和 Hibernate 在 Persistence.xml 中配置 C3P0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23554873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com