C3p0试图创建一个新的连接池并使用ClassNotFoundException失败

时间:2014-01-17 12:34:22

标签: spring hibernate connection-pooling c3p0

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

我的应用程序设置: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%正常工作之前 很好,反应很好。
  • 此外,我还没有提供任何connectionCustomizerClassName属性 我的c3p0配置,为什么要加载一个?在这个堆栈跟踪我 看到它不是空的空字符串''。

任何线索?

=============================================== =============================== 在hibernate jar之后,我在应用程序的类路径中看到了:

  • 冬眠-3.2.6.ga.jar
  • 弹簧休眠-1.2.6.jar

我在应用程序的类路径中看到了c3p0 jar:

  • c3p0-0.9.1.jar
  • c3p0-0.9.2-pre5.jar
  • C3P0-Oracle的薄额外-0.9.2-pre5.jar

手动读取这些属性并在数据源上设置的代码(我根本不读取/设置任何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 个答案:

答案 0 :(得分:1)

在发布的问题的评论中跟进对话,看起来这里的问题是VisualVM将空值属性connectionCustomizerClassName更新为空的String值,c3p0当前处理非null并解释作为班级名称。

继续前进(c3p0-0.9.5-pre7及以上),c3p0将防范这一点,将全空白connectionCustomizerClassName解释为等效为null。但在此期间或旧版本中,请小心。

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

package mypkg;

import com.mchange.v2.c3p0.*;

public class NullConnectionCustomizer extends AbstractConnectionCustomizer
{}

然后使用mypkg.NullConnectionCustomizer作为connectionCustomizerClassName,以便VisualVM中的相应字段不为空,并且模糊地解释为空String或null。