如何在JPA/Hibernate应用程序中配置连接池(不使用Spring)?

3

Persistence.xml

    <properties>
        <property name='javax.persistence.jdbc.driver' value='org.postgresql.Driver' />
        <property name='javax.persistence.jdbc.url'
            value='jdbc:postgresql://192.168.19.66:5432/service1' />
        <property name='javax.persistence.jdbc.user' value='postgres' />
        <property name='javax.persistence.jdbc.password' value='root' />
        <property name='hibernate.dialect' value='org.hibernate.dialect.PostgreSQLDialect' />
        <property name='hibernate.connection.shutdown' value='true' />
        <property name='hibernate.hbm2ddl.auto' value='none' />
        <property name='hibernate.show_sql' value='false' />
        <property name='hibernate.format_sql' value='false' />
                    <!-- Connection Pooling -->
        <property name="hibernate.connection.provider_class"
            value="org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider" />
        <property name="hibernate.c3p0.max_size" value="100" />
        <property name="hibernate.c3p0.min_size" value="5" />
        <property name="hibernate.c3p0.acquire_increment" value="5" />
        <property name="hibernate.c3p0.idle_test_period" value="500" />
        <property name="hibernate.c3p0.max_statements" value="50" />
        <property name="hibernate.c3p0.timeout" value="10000" />
    </properties>

异常

[C3P0PooledConnectionPoolManager[identityToken->1hge4qw8wh4gndjoawud4|b81be4]-AdminTaskTimer] DEBUG com.mchange.v2.async.ThreadPoolAsynchronousRunner - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@5d1aef -- Running DeadlockDetector[Exiting. No pending tasks.]
[C3P0PooledConnectionPoolManager[identityToken->1hge4qw8wh4gndjoawud4|b81be4]-AdminTaskTimer] DEBUG com.mchange.v2.resourcepool.BasicResourcePool - Continuing acquisition series. pending_acquires [5],  attempts_remaining: 20
[C3P0PooledConnectionPoolManager[identityToken->1hge4qw8wh4gndjoawud4|b81be4]-AdminTaskTimer] DEBUG com.mchange.v2.async.ThreadPoolAsynchronousRunner - com.mchange.v2.async.ThreadPoolAsynchronousRunner@b66600: Adding task to queue -- com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@934847
[C3P0PooledConnectionPoolManager[identityToken->1hge4qw8wh4gndjoawud4|b81be4]-HelperThread-#0] DEBUG com.mchange.v2.resourcepool.BasicResourcePool - An exception occurred while acquiring a poolable resource. Will retry.
java.sql.SQLException: No suitable driver
    at java.sql.DriverManager.getDriver(DriverManager.java:264)
    at com.mchange.v2.c3p0.DriverManagerDataSource.driver(DriverManagerDataSource.java:240)
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:146)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:195)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:184)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:200)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1086)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1073)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:44)
    at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1810)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:648)

出现异常java.sql.SQLException: No suitable driver

查看源代码,它正在寻找属性“hibernate.connection.driver_class”,我已经在“javax.persistence.jdbc.driver”中提到了驱动程序类。

我认为我没有正确的方式来配置连接池。该应用程序使用Hibernate 4.1.11(不使用Spring),JPA2,Postgresql 9.1。没有hibernate.cfg.xml。

问题

  • Hibernate / JPA应用程序配置连接池的方式是什么?
  • 我已经在javax.persistence.jdbc.driver中提供了是否提供hibernate.connection.driver_class属性,如果我提供,由连接池创建的连接和JPA连接是否相同或不同?

注意

  • Postgresql驱动程序在类路径中。
  • 如果我删除<!-- Connection Pooling -->后面的行,则运行。但是,如果我添加<!-- Connection Pooling -->后面的行以进行连接池操作,则会出现此异常。

PostgreSQL驱动程序是否在类路径中? - JB Nizet
是的。如果我删除<!-- Connection Pooling -->后面的行,它就可以运行。但是,如果我添加连接池的<!-- Connection Pooling -->后面的行,我会得到这个异常。 - Shashi
设置 hibernate.connection.driver_class 属性有什么问题? - JB Nizet
我已经在javax.persistence.jdbc.driver中提供了吗?连接池创建的连接和JPA连接是相同的还是不同的? - Shashi
2个回答

0

0

在旧时代,您必须使用 Class.forName(org.postgresql.Driver.class) 构造加载适当的驱动程序类。使用 JDBC 4.0 驱动程序不再需要 - 但您可以尝试一下。

或者,尝试使用 -Djdbc.drivers=org.postgresql.Driver 启动应用程序,它几乎与 Class.forName 片段相同,但不需要您硬编码驱动程序类。希望能有所帮助。


谢谢。这并没有帮助。我已经解决了我在答案中发布的这个问题。 - Shashi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接