2011-03-25 53 views
1

我正在用j2ee,hibernate和Spring构建一个web应用程序。在某个时候,应用程序必须发送一些电子邮件,所以我想把这个任务放在一个单独的线程中。详细信息:在应用程序终止时的春天,线程和警告

  • 上有一些状态变量的线程和控制器共享
  • 同步化没有对与控制器共享服务豆同步(应该是什么?)。

无论如何,当我关闭应用程序,我收到以下担心消息:

... 
INFO: Closing Hibernate SessionFactory 
25-mar-2011 10.02.14 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc 
GRAVE: The web application [/Tomcat6Locale] registered the JDBC driver [org.hsqldb.jdbc.JDBCDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 
25-mar-2011 10.02.14 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc 
GRAVE: The web application [/Tomcat6Locale] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 
25-mar-2011 10.02.14 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 
GRAVE: The web application [/Tomcat6Locale] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak. 
25-mar-2011 10.02.15 org.apache.coyote.http11.Http11Protocol destroy 
INFO: Stopping Coyote HTTP/1.1 on http-8080 

,我是不是该线程招之前得到......到底什么时候其中一个线程完成,他们只是返回。我没有做任何特别的事情。我应该做更多吗?

+0

另请参阅http://stackoverflow.com/questions/5292349/this-is-very-likely-to-create-a-memory-leak-tomcat/5292456#5292456 – 2011-03-25 09:39:42

回答

0

该消息看起来非常清楚。你没有清理完自己。这就是Tomasz提出的其他线索谈论的内容。

现在到解决方案:

快速和肮脏的:

清理threadlocals!

我会建议他:

如果您的电子邮件发送确实是一个不同的任务,而不是同步您曾经考虑实施调度,而不是通过一个线程做什么呢?从它的声音你正在寻找的是电子邮件可以异步方式发送。如果您可以选择更改内容,我建议您将这2个进程分开,并使用调度程序执行电子邮件发件人功能。

希望有所帮助。

+0

eeeeerrrrr ....你可以路线我到一个调度是什么:D – gotch4 2011-03-25 11:35:04

+0

http://en.wikipedia.org/wiki/Job_scheduler&http://www.quartz-scheduler.org/ – Nilesh 2011-03-25 11:40:18

+0

errr谢谢......当然,我知道CS类Job调度器,我想知道在J2EE中是否有标准......就像石英一样。谢谢。 – gotch4 2011-03-25 14:34:12

0

我不同意尼莱什的评估。当它被指定为资源时,容器应该管理数据库连接池。假设你关闭了所有的联系,那么理论上你应该没问题。

我听说Apache的DBCP库存在故障。我也听说它已经在更新版本的DBCP中修复,尽管看起来Tomcat的一个版本应该已经发布了。无论如何,手动升级DBCP到最新版本是可以尝试的。

注:我的答案适用于消息的JDBC驱动程序相关部分。说“似乎已经启动了一个名为...的线程”的消息可能通过修复JDBC驱动程序问题来解决,也可能不会解决。