2009-12-04 72 views
3

一般事務可以有多個線程?

我們有一些業務邏輯導致交易中的瓶頸。業務邏輯向數據庫查詢一組數據(只讀),處理它並返回一個對象。這必須在給定的請求中使用不同的參數進行多次。 我們理論上可以將每個業務邏輯調用分解爲一個單獨的線程嗎?

具體

EJB object (part of an http request on a JBoss App Server) 
-creates objects that implement Callable (call method calls business logic method) 
-using an ExecutorService invoke each callable object 

Business Logic 
-Makes a query of postgresql database which uses a PreparedStatement 
-Using POJOs we build objects from ResultSet objects that come from postgresql 
-Do expensive calculations 

這一切之後,我們得到,當我們限制了我們的線程來一個不願透露姓名的門戶網站甚至不存在Postgres的錯誤:

ERROR: cursor "<unnamed portal 777>" does not exist 
STATEMENT: FETCH ALL IN "<unnamed portal 777>" 

我不是非常確定發生了什麼事情會導致錯誤,但業務邏輯被正確調用,並且無需線程就可以正常工作。這讓我質疑線程是否可以啓動並添加到事務中(並且如果他們可以,我們如何做到這一點?)。

+0

你可以把你的交易分成子交易嗎? – 2009-12-04 19:17:26

+0

如何生成連接?一個連接只能在一個線程中使用。 – 2009-12-04 19:18:11

+0

@Liz我是新來的交易一般,所以也許你可以添加一個答案,如何子交易如何適合這個(每個線程?這是如何影響滾動,發生之前?) @Kathy I '不知道你的意思是通過連接,但ejb是填充網頁的請求的一部分,並且postgres調用使用PreparedStatement – Adam 2009-12-04 19:25:26

回答

3

您不應該在EJB(或其他應用程序服務器中的其他位置)中創建線程。如果您需要將其分解,請使用JMS或更簡單,請使用WorkManager在基於EJB的操作中提供併發性。

+0

感謝Robin,爲未來提出的一個方便的頁面是: http: //www.ibm.com/developerworks/java/library/j-jca2/ – Adam 2009-12-04 19:47:36

+0

不幸的是,它看起來像Jboss不支持外部的WorkManager接口,如果它是資源管理:( – Adam 2009-12-04 20:49:04

+0

@Adam - 你可以試試這個 - http: //www.nexopen.org/confluence/display/NXFWK/CommonJ+and+jBoss+integration – Robin 2009-12-04 20:54:47

0

在JDBC上下文中,我會說如果你能夠共享你已經完成「BEGIN TRANSACTION」的連接,並從那裏發出所有的呼叫,那麼是的,它應該至少理論上工作。

我通常不是存儲過程的粉絲,但你有沒有考慮過這些?如果可以在事務中進行線程化,我希望它在數據庫引擎中表現得比在邊界上分散得更清晰。

0

雖然這可能不是正確的方式做事情這是如何拉斷。

使實現Callable的對象不只是調用業務邏輯,而是執行EJB查找並調用該方法。這個結果看起來是這樣的:

EJB object (part of an http request on a JBoss App Server) 
-creates objects that implement Callable (call method calls business logic method) 
-using an ExecutorService invoke each callable object 

Callable Object 
-lookup another EJB instance of the class we are already in to get a transaction going 
-call that instance's business logic 

Business Logic 
-Makes a query of postgresql database which uses a PreparedStatement 
-Using POJOs we build objects from ResultSet objects that come from postgresql 
-Do expensive calculations 

我不太喜歡它這就是爲什麼我沒有選擇它爲最佳答案,但在我們的特定情況下,它的工作原理,我認爲這會幫助別人。