2012-02-17 27 views
2

我有一個標準Spring Roo(1.2.0.RC1)項目,帶有標準域對象。在我的主線程(域控制器)中,我可以使用查找器創建由數據庫支持的域對象(我使用Hibernate/MySQL)的實例,更改一些屬性並通過調用.persist()將這些更改持久保存到數據庫中在要保存的實例上。.persist()在Spring Roo中無法在新線程中工作

如果我這整個邏輯移動到一個Runnable,並在一個新的線程(由ScheduledThreadPoolExecutor.scheduleAtFixedRate()調用),我仍然可以正常創建使用取景器,但改變一些屬性的域對象的情況下,執行它,對要保存的對象調用.persist()對DB沒有影響。我在控制檯日誌中看不到任何內容(在STS內部運行)。我不知道Roo是否創建了任何其他日誌文件,這可能會給我提供更多關於可能發生的線索的線索。有沒有人遇到過上述問題?有誰知道如何在STS控制檯中獲得更詳細的日誌記錄(例如Hibernate查詢日誌記錄)嗎?

+0

顯示我們的代碼。並且請注意,Hibernate Session是單線程對象,並且事務上下文依賴於ThreadLocal變量。 – 2012-02-17 22:41:19

+0

將休眠屬性show-sql添加到persistence.xml以獲取更多信息 – Ilya 2012-02-17 22:55:04

+0

是的,Hibernate會話通常存儲爲ThreadLocal變量 - 因此您在新線程中創建的對象沒有Hibernate會話。 – GreyBeardedGeek 2012-02-22 02:07:28

回答

0

它與交易有關。 Hibernate或JTA中的默認值是使用綁定到線程的本地事務。真的,你不應該嘗試跨線程共享事務。無論你在線程之間共享什麼對象(休眠會話?),我敢打賭他們實際上並不是線程安全的。

我會盡量簡化您的代碼,而不是在多個線程中處理更新。如果您必須使用多個線程,則他們必須各自擁有自己的事務。

很可能,您只需要爲每個線程創建一個新的事務。但這就是爲什麼你可以從你的線程中選擇數據,但你不能堅持。這聽起來像你的線程內的交易沒有被關閉。

相關問題