当前位置: 首页 > 面试题库 >

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

郗缪文
2023-03-14
问题内容

如果通过tomcat 7上的netbeans重新部署该项目,那么我会收到类似以下错误

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连接池线程,它们要么在重新部署时未正确销毁,要么可能正在执行一些活动连接或类似的操作。

关于如何重新部署这样使用hibernate和c3p0的项目,是否有最佳实践?是否需要编写一些代码才能contextDestroyed正确关闭c3p0线程?


问题答案:

我也遇到了同样的问题,并且在雄猫控制台中可以看到以下警告

2014年7月30日3:20:16 PM org.apache.catalina.loader.WebappClassLoader
clearReferencesThreads警告:Web应用程序[/
rmlcrm]似乎已启动名为[C3P0PooledConnectionPoolManager [identityToken->
1hge50p9311d8syo1hfjimz |
19ddf1db#-Helper]的线程0],但未能停止。这很可能造成内存泄漏。线程的堆栈跟踪:java.lang.Object.wait(本机方法)com.mchange.v2.async.ThreadPoolAsynchronousRunner
$ PoolThread.run(ThreadPoolAsynchronousRunner.java:635)


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

我们没有完全使用我们不想与C3P0硬耦合的代码。但是我们意识到我们没有在应用程序中的任何地方关闭hibernate会话工厂。我们在ServletContextListener的contextDestroyed()中添加了代码以关闭hibernate会话工厂。现在我们没有错误,并且在tomcat控制台中也没有得到警告。



 类似资料:
  • 我正试图将一个。war项目部署到我的tomcat7安装中。 我使用的是Ubuntu12.04和Tomcat7。

  • 问题内容: 我是休眠的新手,已经开始使用C3P0作为休眠的连接池管理器,因为没有它,在与MySQL服务器没有联系8个小时之后,我遇到了超时问题。 切换到C3P0后,我最近遇到了死锁,我不确定它是如何发生的。我虽然显示了所有堆栈跟踪和配置。 这是配置日志 这是我设置的属性 这是被锁定的线程之一的线程转储。 由于我对此并不陌生,因此无法从日志和转储中识别问题。我还注意到C3P0创建了很多线程。 问题答

  • 除非我真的很沮丧,否则我不会发这个帖子。我试图在一个非常简单的应用程序中用Hibernate 4.1.1配置C3P0,但是我得到了一个类未找到异常。我已经在类路径中包含了C3P0特定的jar文件。Hibernate-c3p0-3.5.2-Final.jar hibernate.properties: Stacktrace:

  • c3p0 是一个成熟的、高并发的 JDBC 连接池库,支持缓存和 PreparedStatements 的重用。它以LGPL v.2.1或EPL v.1.0授权。 详细的文档在C3P0的下载包中。本站提供最新版的C3P0文档,链接是: http://tool.oschina.net/apidocs/apidoc?api=c3p0

  • 我有一个使用Struts1.3、Hibernate3和Spring Security开发的web应用程序。由于MySQL在此时间之后关闭了连接,该应用程序在8小时后就停止了运行。然后我从几个帖子中收集信息,使它保持很长时间,现在差不多是20-24小时。有没有人能帮我把这东西弄好。 摘要 Iam在不活动20小时后无法登录。连接被MySQL关闭。 多谢了。 C3p0日志 INFO AbstractPo

  • 问题内容: 我在Tomcat上有一个Spring Hibernate应用程序。连接池为C3P0 我迅速遇到来自C3P0的线程池已满警告。然后,对Web应用程序的所有请求都将挂起。 我仍然假设在代码中的某个地方我错过了@Transaction注解。我想调试我的代码。 问题:是否可以通过代码访问连接池,以便在释放连接和不释放连接时进行调试? 更新:当前c3p0配置: 问题答案: 我可以通过代码访问连接