使用JPA和Hibernate在Persistence.xml中配置C3P0 [英] Configuring C3P0 in Persistence.xml with JPA and Hibernate

查看:153
本文介绍了使用JPA和Hibernate在Persistence.xml中配置C3P0的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好吧,我正在尝试首次使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆