2009-08-17 38 views
2

我想了解使用ThreadLocal進行上述問題的最佳方法。根據我的理解,使用此功能的原因是爲了確保只爲整個應用程序創建一個會話/分鐘。我的問題是使用hibernate session/JDO persistenceManager時的ThreadLocal

  1. 是否有任何影響使用threadlocal這樣的羣集應用程序? (例如谷歌應用程序引擎)?

  2. 如果你使用「事務性」開始,在我的應用程序上提交,我不需要使用threadlocal權利?因爲「事務」已經確保我的會話正常打開和關閉?

  3. 如果我需要使用「transactional」,tx,它也應該在threadlocal中嗎?

  4. 爲什麼不只是使用「靜態」而不是「threadlocal」?

我希望聽到您對使用此技術的優點/缺點的反饋嗎?

回答

4
  1. 可能不會,除非您的羣集軟件可以在節點之間遷移線程。在這種情況下,你也需要遷移線程本地數據。

  2. 否。該事務附加到會話,因此您必須保持同步。雖然你可以在線程A中開始一個事務並在線程B中提交它,但通常很難確保它可靠地工作。因此:不要。

  3. 是的。

  4. static是全局應用程序。每個線程的全局線程數爲threadlocal

結論:如果你是這方面的初學者,我建議使用Spring。 Spring框架爲您解決了許多問題,並在出現問題時幫助您處理有用的錯誤消息。

按照文件的信函,特別是當它沒有意義。有可能你錯過了一些重要的東西,而春天的人是對的。

+0

同意。同樣,如果你的代碼中的任何地方都有「新的Connection()」,那麼你就錯了。用Spring來抽取所有的細節。 – Trenton

2

ThreadLocal不用於爲整個應用程序創建一個會話。它用於爲每個線程創建一個會話。每個用戶會話將是一個線程,因此ThreadLocal確保每個訪問您網頁/數據庫的用戶都將獲得自己的數據庫連接。如果您使用靜態單例模式,服務器上的每個用戶都將使用相同的數據庫連接,但我不知道如何解決這個問題。

0

許多事務引擎的實現實際上是使用ThreadLocal將會話狀態與數據庫關聯到特定的線程。這使得例如在事務內部運行多個線程非常困難。

ThreadLocal是線程安全的保證,但稍後可以通過另一段代碼以半靜態方式進行查詢。它是一個線程全局變量。這使它對臨時但會話感知信息有用。除了交易之外的另一個用途可能會保留授權的內部參數,然後使用代理進行檢查。