问题描述
我的应用程序有两个石英作业同时从 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 [信息] Hibernate 注释 3.2.1.GA
2021-02-15 18:47:26,299 [信息] 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 [信息] 使用方言:
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 [WARN] sql 错误:0,sqlState:空
2021-02-15 18:48:38,923 [错误] com.mchange.v2.c3p0.PoolBackedDataSource@add8f7b3
[ connectionPoolDataSource ->
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} ],优选TestQuery -> null,propertyCycle -> 0,
testConnectionOnCheckin -> 假,testConnectionOnCheckout -> 假,
unreturnedConnectionTimeout -> 0,usesTraditionalReflectiveProxies ->
错误的; 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 连接类型为基本。
知道我做错了什么吗?
解决方法
这是一个旧的休眠版本。
您对 hibernate-c3p0 和 c3p0 的依赖项是什么?
从另一个帖子检查,似乎 c3p0 的连接提供程序类是
org.hibernate.connection.C3P0
,但后来在 org.hibernate.connection.C3P0ConnectionProvider
中被弃用。
也许根据您的休眠版本,您应该尝试使用较旧的连接提供程序类。