如何在tomcat 7上重新部署一个hibernate-c3p0项目而不会出现奇怪的c3p0错误 [英] How to re-deploy a hibernate-c3p0 project on tomcat 7 without getting strange c3p0 errors

查看:408
本文介绍了如何在tomcat 7上重新部署一个hibernate-c3p0项目而不会出现奇怪的c3p0错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果项目是通过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)$ b $ java.util.TimerThread.mainLoop(Timer.java:512)
java.util.TimerThread.run(Timer .java:462)
线程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)
在java.util.TimerThread.mainLoop(Timer.java:512)
在java.util.TimerThread.run(Timer.java:462)
导致: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开发人员:java.lang.NoClassDefFoundError:com / mchange / v2 / lang / VersionUtils 
com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.j ava: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(
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(加载er.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 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
警告:Web应用程序[/ rmlcrm]似乎启动了一个名为[C3P0PooledConnectionPoolManager [identityToken-> 1hge50p9311d8syo1hfjimz | 19ddf1db] -HelperThread-# 0]但未能阻止它。这很可能造成内存泄漏。
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:635)


我正在阅读很多文章以找到解决方案,并且发现了这篇文章
Hibernate:OutOfMemoryError:PermGen空间



Nicholas Hemley在帖子中的一条评论建议添加一个自定义的ServletContextListener,并在应用程序未部署时执行的侦听器的contextDestroyed()方法中明确关闭C3P0连接。



我们没有使用该代码与我们不希望与C3P0硬连接的代码完全相同。但是我们意识到我们并没有在应用程序的任何地方关闭hibernate sessionFactory。
我们添加了关闭ServletContextListener的contextDestroyed()中的hibernate会话工厂的代码。
现在我们没有错误,也没有在tomcat控制台中发出警告。



您可能还想阅读

a>


If the project is re-deployed through netbeans on tomcat 7 then I get errors like

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

Today we got another strange error when we tried to re-deploy the project on 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)

We have been getting such strange errors since quite some time now. When we try to debug, we find the classes already existing.

What I can think of is dangling c3p0 connection-pooling threads, which are either not destroyed properly on re-deploying, or may be having some active-connection executing or something similar.

Are there any best practices on how to re-deploy such a project which uses hibernate & c3p0 ? Is there some code that I have to write on contextDestroyed for proper closing of c3p0 threads ?

解决方案

I was also facing the same problem and I could see the below warning in my tomcat console

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)

I was reading a lot to find out a solution to this and came across the post Hibernate :OutOfMemoryError: PermGen space

One of the comment in the post by Nicholas Hemley suggested to add a custom ServletContextListener and explicitly close the C3P0 connections in contextDestroyed() method of the listener which will be executed when the application is un-deployed.

We did not use the code exactly as we did not want to hard-couple with C3P0. But we realized that we are not closing hibernate sessionFactory anywhere in our application. We added the code to close the hibernate session factory in contextDestroyed() of the ServletContextListener. Now we do not have the error and neither we get a warning in the tomcat console.

You may also want to read Hibernate : closing the session factory does not close the c3p0 connection pool

这篇关于如何在tomcat 7上重新部署一个hibernate-c3p0项目而不会出现奇怪的c3p0错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆