2010-04-15 82 views
1

如何配置Hibernate以便每次調用sessionFactory.openSession()時都將它與來自連接池的新連接進行連接?連接池由Websphere Application Server管理,並且是JDBC數據源。配置休眠以獲得連接池中的全新連接

感謝

+1

這個要求的原因是什麼?爲了避免游泳池中陳舊的連接? – 2010-04-15 19:47:07

+0

我需要在Web應用程序中的單個請求中打開2個會話。現在,看起來兩個會話都使用相同的連接,因爲有時會關閉第一個會話(手動調用session.close()),另一個會話在嘗試運行更多查詢時會引發「會話關閉」異常它。第二個會話由一個子線程打開,這意味着即使(HTTP)請求完成後,子線程也可以保持活動狀態。 – 2010-04-15 20:22:44

+0

您能否在問題持續存在的地方顯示簡化的代碼?我認爲會話是1:不是線程安全的,你不應該將會話對象傳遞給另一個線程。 2:線程綁定(取決於您使用的tx mgnt堆棧)。你是否在同一個線程中打開兩個會話?如果是的話嘗試在不同的線程中打開它們中的每一個 – Thierry 2010-04-15 21:25:04

回答

2

如何配置Hibernate這樣每次我打電話sessionFactory.openSession()它與連接池一個新的連接連接?

這是默認行爲,每個會話將從連接池獲得專用連接。

現在,看起來兩個會話都使用相同的連接,因爲當第一個會話有時關閉(手動調用session.close())時,其他會話將在會話時引發「會話關閉」異常試圖運行更多的查詢。

不,他們不是。但是也許第二個連接在爲請求啓動的事務結束時被釋放。看看hibernate.connection.release_modeconfiguration parameter,你可能想用on_close。但沒有關於交易策略的更多細節,就不可能說出任何內容。

第二個會話由子線程打開,這意味着即使(HTTP)請求完成後子線程仍可以保持活動狀態。

以我以前的建議與一粒鹽,你應該不會產卵unmanaged threads,我不知道應用服務器將如何表現。我在this other answer中解釋什麼是正確的方法。

+0

非常感謝,我得到了它的工作。 – 2010-04-16 15:14:36

+0

@ferrari不客氣。很高興它的工作。 – 2010-04-16 15:31:45