2011-05-08 141 views
2

我想爲一系列數據庫調用(串行)創建ThreadPool。我們想要保存那些毫秒。所以我們不想浪費時間來串行執行數據庫查詢。 我正在處理已經有很多並行節點的服務器應用程序。在其中一個節點中,有一系列數據庫調用。我想在已經與其他節點並行運行的節點內引入並行性。Java:在服務器應用程序中創建線程池

線程池執行器是不錯的選擇嗎?我不知道我會運行多少個查詢。它取決於請求對象的狀態。所以我無法修復線程池的隊列大小。

This is the example that I have found.

是這有效嗎?還有其他的選擇嗎?任何建議將不勝感激。

+0

你使用什麼容器?有可能它已經支持它。 – h3xStream 2011-05-08 16:10:08

+0

我們正在使用Geronimo。 – 2011-05-08 16:15:21

回答

4

在Java EE環境中產生自己的線程通常是一個糟糕的主意。有時需要完成,但如果有其他選擇,則不應該這樣做。我不確定你想要做什麼,以及你正在使用什麼版本的Java EE,但是如果它是6,那麼也許你可以使用asynchronous EJB.

+0

我們使用Java 6,Geronimo容器。所以我們的架構提倡線程化。當請求進入時,我們從請求中創建獨立的節點並且並行地執行它。現在我的問題是需要並行化的節點之一。我瞭解異步EJB或消息傳遞可能是一個解決方案。但是,我們可以堅持線程化嗎? – 2011-05-08 16:19:11

+0

這個線程解決方案有什麼缺點嗎? – 2011-05-08 16:22:30

+0

當您使用異步EJB(或JMS)時,您仍在使用線程,只是容器正在爲您管理線程。如果你嘗試自己產卵和管理線程,我保證你會遇到問題。看到這裏進一步的解釋:http://stackoverflow.com/questions/533783/why-spawning-threads-in-j2ee-container-is-discouraged – 2011-05-08 16:30:32

3

你的問題的標準解決方案是使用JMS 。每個查詢應該包裝到命令中。命令應該作爲JMS消息發送到隊列中。 MDB(消息驅動bean)應該接收它們的消息並異步執行查詢。

這種方法還有另外一個優點:如果你正在使用多臺物理服務器,工作將分佈在其中,因此係統將更加強大。

+0

因此,使用線程池執行程序進行線程化是一個壞主意?在這種情況下線程有什麼缺點? – 2011-05-08 16:21:08

+2

線程池執行器是一個好主意。但是它在JEE環境中是被禁止的。你應該讓應用程序。服務器來管理線程。我知道只有2種「合法」方式可以做到這一點:JMS和JCA(它允許你請求應用程序服務器從其線程池中獲取線程)。但是絕對不要在JEE環境中管理自己的線程!顯然,如果你正在實現你自己的獨立應用程序,你可以做到這一點。 – AlexR 2011-05-08 16:27:30

+0

如何使用Geronimo線程池? http://geronimo.apache.org/apidocs/2.0.1/org/apache/geronimo/pool/ThreadPool.html – 2011-05-08 16:44:15

相關問題