当前位置: 首页 > 知识库问答 >
问题:

C3p0尝试创建新连接池,但失败,ClassNotFoundException

聂煜
2023-03-14

我在应用程序中看到一个非常奇怪的行为。

我的应用程序设置:Spring Hibernate C3p0

应用程序保持运行良好,当突然我开始看到这些错误的日志和系统完全停止处理任何数据库特定的请求。

WARN c3p0.C3P0Registry - Could not create for find ConnectionCustomizer with class name ''.
java.lang.ClassNotFoundException: 
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at com.mchange.v2.c3p0.C3P0Registry.getConnectionCustomizer(C3P0Registry.java:181)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPoolManager.getConnectionCustomizer(C3P0PooledConnectionPoolManager.java:636)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPoolManager.createPooledConnectionPool(C3P0PooledConnectionPoolManager.java:738)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPoolManager.getPool(C3P0PooledConnectionPoolManager.java:257)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPoolManager.getPool(C3P0PooledConnectionPoolManager.java:271)
at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:80)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
at org.hibernate.jdbc.AbstractBatcher.prepareSelectStatement(AbstractBatcher.java:123)
at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:73)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:94)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495)
at org.springframework.orm.hibernate3.HibernateTemplate$18.doInHibernate(HibernateTemplate.java:690)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:365)
at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:687)
  • 为什么C3p0需要在这个特殊的时间创建一个新的连接池,在这些异常之前,应用程序100%工作正常,响应良好

有什么线索吗?

=======================================================================================================================================我在应用程序的类路径中看到以下hibernate JAR:

  • hibernate-3.2.6.ga.jar
  • spring-hibernate-1.2.6.jar

我在应用程序的类路径中看到以下c3p0 JAR:

  • c3p0-0.9.1.jar
  • c3p0-0.9.2-pre5.jar
  • c3p0-oracle-thin-extras-0.9.2-pre5.jar

手动读取这些属性并在datasource上设置的代码(我在这里根本不读取/设置任何connectionCustomizerClassName属性)

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setMinPoolSize(Integer.parseInt(props.getProperty("jdbc.hibernate.c3p0.minPoolSize")));
.....

以下是正在使用的C3p0属性:

jdbc.hibernate.c3p0.minPoolSize=100
jdbc.hibernate.c3p0.initialPoolSize=100
jdbc.hibernate.c3p0.maxPoolSize=1000
jdbc.hibernate.c3p0.maxIdleTime=21600
jdbc.hibernate.c3p0.maxStatementsPerConnection=0
jdbc.hibernate.c3p0.maxStatements=0
jdbc.hibernate.c3p0.numHelperThreads=30
jdbc.hibernate.c3p0.checkoutTimeout=30000
jdbc.hibernate.c3p0.idleConnectionTestPeriod=900
jdbc.hibernate.c3p0.preferredTestQuery=SELECT 1 FROM dual
jdbc.hibernate.c3p0.maxConnectionAge=0
jdbc.hibernate.c3p0.maxIdleTimeExcessConnections=3600
jdbc.hibernate.c3p0.acquireIncrement=10
jdbc.hibernate.c3p0.acquireRetryDelay=5000
jdbc.hibernate.c3p0.acquireRetryAttempts=6
jdbc.hibernate.c3p0.propertyCycle=180

共有1个答案

姜弘新
2023-03-14

在发布的问题评论中的对话之后,这里的问题似乎是VisualVM将空值属性connectionCustomizerClassName更新为空字符串值,c3p0当前将其视为非空值并解释为类名。

展望未来(c3p0-0.9.5-pre7及以上),c3p0将防止这种情况,将全空白连接CustomizerClassName解释为等同于null。但与此同时,或者对于旧版本,要小心。

一个简单的解决方法是定义NullConnectionCustomizer:

package mypkg;

import com.mchange.v2.c3p0.*;

public class NullConnectionCustomizer extends AbstractConnectionCustomizer
{}

然后使用mypkg。NullConnectionCustomizer用于connectionCustomizerClassName,因此VisualVM中的相应字段不是空的,并且可以模糊地解释为空字符串或null。

 类似资料:
  • SQL*Plus:30 12:51:12 201410月4日发布12.1.0.2.0产品 版权所有(c)1982年,2014年,甲骨文。版权所有。 连接到:Oracle Database 12c Enterprise Edition 12.1.0.2.0版-64位生产,带有分区、OLAP、高级分析和实际应用程序测试选项 SQL 在第1行创建由johndoe*错误标识的用户johndoe:ORA-6

  • 无法使用C3P0创建Hibernate-JPA连接池。面对以下错误日志: 请求请提供一个解决方案如何创建连接池使用JPA在KARAF。

  • 很好的一天! 我正在从glassfish迁移到JBoss 7.1.3。我有。无法创建远程连接的ear应用程序。我猜我的EJB有问题。 下面是我部署的EJB(来自服务器日志) 下面是我在资源调配器中的上下文查找。java代码 下面我已经粘贴了我的服务器。日志和我的应用程序日志供您参考。我遇到错误,比如无法创建远程连接。我在加载包含上述属性的初始上下文时遇到问题。。。ctx=新的初始上下文(jndiP

  • 我正在使用java web服务(apache axis)和JDBC连接来连接postgres数据库,以获取数据。但突然间,在大多数情况下,我都遇到了

  • 我使用以下参数创建连接池: 我尝试在glassfish web界面中ping,我得到了一个例外: MyPool的ping连接池失败。无法分配连接,因为:ORA-00604:递归SQL级别1 ORA-12705发生错误:无法访问指定的NLS数据文件或无效环境请查看server.log了解更多详细信息。发生错误MyPool的ping连接池失败。无法分配连接,因为:ORA-00604:递归SQL级别1