2011-03-25 93 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驅動程序問題來解決,也可能不會解決。