java - 如何在 tomcat 7 上重新部署 hibernate-c3p0 项目而不会出现奇怪的 c3p0 错误

标签 java hibernate tomcat tomcat7 c3p0

如果通过 netbeans 在 tomcat 7 上重新部署该项目,则会收到类似错误

java.lang.IllegalStateException
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    at com.mchange.v2.resourcepool.BasicResourcePool.checkIdleResources(BasicResourcePool.java:1481)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$2000(BasicResourcePool.java:32)
    at com.mchange.v2.resourcepool.BasicResourcePool$CheckIdleResourcesTask.run(BasicResourcePool.java:1964)
    at java.util.TimerThread.mainLoop(Timer.java:512)
    at java.util.TimerThread.run(Timer.java:462)
Exception in thread "Timer-5" java.lang.NoClassDefFoundError: com/mchange/v2/resourcepool/BasicResourcePool$AsyncTestIdleResourceTask
    at com.mchange.v2.resourcepool.BasicResourcePool.checkIdleResources(BasicResourcePool.java:1481)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$2000(BasicResourcePool.java:32)
    at com.mchange.v2.resourcepool.BasicResourcePool$CheckIdleResourcesTask.run(BasicResourcePool.java:1964)
    at java.util.TimerThread.mainLoop(Timer.java:512)
    at java.util.TimerThread.run(Timer.java:462)
Caused by: java.lang.ClassNotFoundException: com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    ... 5 more

今天,当我们尝试在 tomcat 7 上重新部署项目时,遇到了另一个奇怪的错误

[5:07:02 PM] Nitin - Webscraper/Tester,Java/PHP developer: java.lang.NoClassDefFoundError: com/mchange/v2/lang/VersionUtils
 com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:104)
 com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:65)
 com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:62)
 com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:531)
 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
 org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:78)
 org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
 org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
 org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
 org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1700)
 org.hibernate.loader.Loader.doQuery(Loader.java:801)
 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
 org.hibernate.loader.Loader.doList(Loader.java:2542)
 org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
 org.hibernate.loader.Loader.list(Loader.java:2271)

很长一段时间以来,我们一直收到此类奇怪的错误。当我们尝试调试时,我们发现类已经存在。

我能想到的是悬挂的 c3p0 连接池线程,这些线程要么在重新部署时没有正确销毁,要么可能正在执行一些 Activity 连接或类似的东西。

是否有关于如何重新部署此类使用 hibernate 和 c3p0 的项目的最佳实践?我是否必须在 contextDestroyed 上编写一些代码才能正确关闭 c3p0 线程?

最佳答案

我也面临同样的问题,我可以在我的 tomcat 控制台中看到以下警告

Jul 30, 2014 3:20:16 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads WARNING: The web application [/rmlcrm] appears to have started a thread named [C3P0PooledConnectionPoolManager[identityToken->1hge50p9311d8syo1hfjimz|19ddf1db]-HelperThread-#0] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.lang.Object.wait(Native Method) com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:635)

我读了很多书来寻找解决方案,并发现了这篇文章 Hibernate :OutOfMemoryError: PermGen space

Nicholas Hemley 帖子中的评论之一建议添加自定义 ServletContextListener 并在监听器的 contextDestroyed() 方法中显式关闭 C3P0 连接,该方法将在应用程序取消部署时执行。

我们没有使用该代码,因为我们不想与 C3P0 硬耦合。但我们意识到我们没有在应用程序中的任何地方关闭 hibernate sessionFactory。 我们在 ServletContextListener 的 contextDestroyed() 中添加了关闭 hibernate session 工厂的代码。 现在我们没有出现错误,也没有在 tomcat 控制台中收到警告。

您可能还想阅读Hibernate : closing the session factory does not close the c3p0 connection pool

关于java - 如何在 tomcat 7 上重新部署 hibernate-c3p0 项目而不会出现奇怪的 c3p0 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19905673/

相关文章:

java - IntelliJ IDEA 看不到项目 gradle 模块

java - hibernate和Spring boot的问题

java - 鉴别器公式

tomcat 可扩展性 ejb

tomcat - 错误页面(500.html、404.html 等)未在 rails/jruby 环境中呈现

java - 将 ActiveRecord 数据模型逆向工程为 jpa

java - 当来自数据源 Netbeans/Hibernate 的 "retrieving the keys"时,来自数据库的实体类挂起

java - 提供 tomcat-users.xml 时,Tomcat 镜像不会在 Docker 上启动

使用 while 循环进行 Java 数据验证

java - 初始 SessionFactory 创建失败 : java. lang.NoClassDefFoundError: javax/persistence/NamedStoredProcedureQuery