2008-11-07 56 views
5

我建立的作品像這樣的多線程系統:如何維護兩個nHibernate會話的對象?

雖然有實體:

  1. 獲取從NHibernate的實體(使用當前會話)

  2. 啓動一個新的線程將與這個實體一起工作*

當我啓動這個新的線程時,需要有一個新的會話,因爲nHibernate不是線程安全的。我創建它,但之前檢索的實體不適用於此會話。

今天我正在解決這種情況從nHibernate中檢索一個新的實體傳遞id。但這樣很昂貴,我正在努力節省一些時間來實現我的SLA。

有什麼辦法可以將這個對象鏈接到這個新的會話,而不需要做一個新的數據庫調用?其他會話將不會關閉,它們都會一直打開,直到應用程序結束。

回答

4

如果您使用分離對象,則必須將它們重新連接到會話。你可以這樣做,如果你有你正在使用的對象的正確的Hibernate ID,調用一個get,然後將你的副本與剛剛投入會話的Hibernate合併。不過,請確保使用合併,因爲saveOrUpdate()不會刪除分離對象中缺少的任何子項,只需添加新子項並將更改保存到現有子項。

+0

事實上,我有這樣的對象到新的會話,調用新會話的get,但重點是試圖避免再次調用分貝,因爲性能改進的目的。 – 2008-11-07 17:08:49

2

除了Evict + Lock之外,你可以利用2:nd級緩存來重建實體而不用去數據庫。我不知道它是否適合您的應用程序,但我也認爲只要第一個線程停止對其進行更改,就可以將會話傳遞給其他用戶。

1

我把它從第一個線程分離後,附加到另一個線程。