【问题标题】:c3p0 connection pooling library with Hibernate 3.2.6/JPA - Cannot open connection带有 Hibernate 3.2.6/JPA 的 c3p0 连接池库 - 无法打开连接
【发布时间】:2021-05-18 16:44:22
【问题描述】:

我的应用程序有两个石英作业,同时从 Oracle DB 读取两个不同的表。 我正在尝试使用带有 Hibernate 和 Oracle 的 c3p0 从池中获取连接。当 Tomcat 7 启动时,似乎 C3P0 已初始化:

2021-02-15 18:47:26,271 [信息] Hibernate EntityManager 3.2.1.GA
2021-02-15 18:47:26,290 [INFO] Hibernate Annotations 3.2.1.GA
2021-02-15 18:47:26,299 [INFO] Hibernate 3.2.6
...
2021-02-15 18:47:27,473 [INFO] 初始化 c3p0-0.9.1 [建于 2007 年 1 月 16 日 14:46:42;调试?真的;跟踪:10]
2021-02-15 18:47:27,621 [信息] 正在初始化 c3p0 池... com.mchange.v2.c3p0.PoolBackedDataSource@add8f7b3 [ 连接池数据源 -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@e6d03554 [ acquireIncrement -> 1,acquireRetryAttempts -> 30,acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, ... ]

2021-02-15 18:47:28,240 [INFO] RDBMS:Oracle,版本:Oracle 数据库 11g 发布 11.1.0.0.0 - 生产
2021-02-15 18:47:28,241 [INFO] JDBC驱动:Oracle JDBC驱动,版本:10.2.0.4.0
2021-02-15 18:47:28,280 [INFO] 使用方言: org.hibernate.dialect.Oracle10gDialect

但是几行之后还是显示Hibernate内置连接池,不知道是不是应该这样? :

2021-02-15 18:47:37,726 [INFO] 使用 Hibernate 内置连接 池(不用于生产!)
2021-02-15 18:47:37,726 [INFO] Hibernate 连接池大小:20

无论如何,第一个作业成功从 Oracle DB 获取数据后,第二个作业无法从池中获取连接,因为它已关闭:

2021-02-15 18:48:38,923 [警告] SQL 错误:0,SQLState:空
2021-02-15 18:48:38,923 [错误] com.mchange.v2.c3p0.PoolBackedDataSource@add8f7b3 [连接池数据源-> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@e6d03554 [ acquireIncrement -> 1,acquireRetryAttempts -> 30,acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null,connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null,forceIgnoreUnresolvedTransactions -> false,identityToken -> 2zgg5baf1aa5t7d1frz5fs|700f6fc5,idleConnectionTestPeriod -> 3000, initialPoolSize -> 10, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0,maxIdleTime -> 300, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 20, maxStatements -> 50, maxStatementsPerConnection -> 0, minPoolSize -> 10, 嵌套数据源 -> com.mchange.v2.c3p0.DriverManagerDataSource@2f7ccb64 [描述-> null, driverClass -> null, factoryClassLocation -> null, identityToken -> 2zgg5baf1aa5t7d1frz5fs|6a16a596, jdbcUrl -> jdbc:oracle:thin:@10.129.12.158:1520:orcl, 属性 -> {user=, 密码=, autocommit=true, release_mode=auto} ], 首选测试查询-> null,propertyCycle-> 0, testConnectionOnCheckin -> 假,testConnectionOnCheckout -> 假, unreturnedConnectionTimeout -> 0,使用TraditionalReflectiveProxies -> 错误的; userOverrides: {} ],dataSourceName -> null, factoryClassLocation -> null,identityToken -> 2zgg5baf1aa5t7d1frz5fs|63308385, numHelperThreads -> 3 ] 已经 closed() -- 你不能再使用它了。
2021-02-15 18:48:38,923 [DEBUG] [docadmin] ccmwsWebQuartz::GenerateDocumentTypeOfRequestJob.generateDocumentTypeOfRequest() - errororg.hibernate.exception.GenericJDBCException:无法打开连接
2021-02-15 18:48:38,923 [DEBUG] ccmwsWebQuartz::GenerateDocumentTypeOfRequestJob.generateRequest():异常:org.hibernate.exception.GenericJDBCException:无法打开连接 1613411318923 毫秒。 javax.persistence.PersistenceException:org.hibernate.exception.GenericJDBCException:无法打开连接 在 org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:629) 在 org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:73) 在 com.ct.contentintegration.scheduler.GenerateDocumentTypeOfRequestJob.generateDocumentTypeOfRequest(GenerateDocumentTypeOfRequestJob.java:165) 在 com.ct.contentintegration.scheduler.GenerateDocumentTypeOfRequestJob.generateRequest(GenerateDocumentTypeOfRequestJob.java:89) 在 com.ct.contentintegration.scheduler.GenerateDocumentTypeOfRequestScheduler.execute(GenerateDocumentTypeOfRequestScheduler.java:23) 在 org.quartz.core.JobRunShell.run(JobRunShell.java:202) 在 org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529)
原因:org.hibernate.exception.GenericJDBCException:无法打开连接

配置文件如下所示: persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Persistence deployment descriptor for dev profile -->
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
    version="1.0">
    
    <persistence-unit name="jpaCcmwsWebJob">

        <provider>org.hibernate.ejb.HibernatePersistence</provider>

<!--                        RAZVOJ                               -->

        <properties>

            <property name="hibernate.connection.url" value="jdbc:oracle:thin:@10.129.12.158:1520:orcl" />

            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />

            <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver" />

            <property name="hibernate.connection.password" value="docadmin2010" />

            <property name="hibernate.connection.username" value="docadmin" />

            <property name="hibernate.show_sql" value="false" />
            

            
            <property name="hibernate.c3p0.acquire_increment" value="1" />
            <property name="hibernate.c3p0.min_size" value="10" />
          <property name="hibernate.c3p0.max_size" value="20" />
          <property name="hibernate.c3p0.timeout" value="300" />
          <property name="hibernate.c3p0.max_statements" value="50" />
          <property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" />
          <property name="hibernate.c3p0.idle_test_period" value="3000" />

        </properties>

    </persistence-unit>

</persistence>

Oracle 连接类型是基本

任何想法我做错了什么?

【问题讨论】:

    标签: java oracle hibernate c3p0


    【解决方案1】:

    这是一个旧的休眠版本。

    您对 hibernate-c3p0 和 c3p0 的依赖项是什么?

    从另一个帖子检查,似乎 c3p0 的连接提供程序类是 org.hibernate.connection.C3P0 但后来被 org.hibernate.connection.C3P0ConnectionProvider 弃用。

    也许根据您的休眠版本,您应该尝试使用较旧的连接提供程序类。

    hibernate connection pool

    【讨论】:

    • 这是一个仍在生产中的旧项目。我只添加了 c3p0-0.9.1.jar,没有任何其他与 C3p0 相关的 jar。现有的休眠 jar 包有:hibernate3.jar、hibernate-annotations.jar、hibernate-commons-annotations-3.3.0.jar、hibernate-entitymanager.jar。是否需要升级休眠版本才能实现 c3p0 连接池?
    • 尝试包含更新版本的 hibernate-c3p0,如 3.3.2.GA 并将 hibernate.connection.provider_class 设置为 org.hibernate.c3p0.internal.C3P0ConnectionProvider
    • 我已经包含了 hibernate-core-3.3.2.GA.jar 和 hibernate-c3p0-3.3.2.GA.jar 而不是 hibernate3.jar,但是错误是一样的。除此之外 connection.provider_class 不是 org.hibernate.c3p0.internal.C3P0ConnectionProvider 因为该版本中的包是 org.hibernate.connection.C3P0ConnectionProvider
    • 如果运行一次然后失败,您可以在此处添加代码示例进行检查
    • 当我使用 hibernate 内置连接池时,(没有任何 C3P0 jars)这两个作业可以正常工作几个小时甚至一整天,但最终得到错误 SQL Error: 17008, SQLState: null, connection关闭。这就是为什么我认为代码是正确的,但我稍后会发布它 笔记本电脑电池没电了:-) 并且没有电源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 2014-08-21
    • 1970-01-01
    • 2013-08-20
    • 2015-02-09
    • 2010-11-25
    • 1970-01-01
    相关资源
    最近更新 更多