2011-12-07 181 views
3

我有一個情況,涉及到幾個線程同時填充數據庫與從網絡資源刮取的數據。刮板將定期運行以收集來自各種來源的新數據。NHibernate的多線程會話管理

我是新使用NHibernate並不完全確定如何最好地管理會話。

的每個工人做什麼一個例子:

  • 颳去網頁源
  • 刮相關的每個實體B,並記錄A有其他的B實體A(即A有很多B,一個B有一個A)

要堅持每個B,會話需要一個引用A來創建B,然後A需要將B添加到其子列表。 A和B都被堅持。

這種AB孩子 - 父母情況有一個層次結構,這樣A有很多B,B有很多C ...在葉級,A有成千上萬的葉子,所以這是不切實際的(?)保持會議一直沿着這條鏈路開放。

另一種方法是將每個父代的標識符記錄在鏈中(可以獨立於會話存儲),並在每次需要創建子代時通過此標識加載到父代中。

我也明白,ISession是爲了單線程,所以我將至少需要每個線程一個會話,但除此之外,我真的不知道最好的方法?

任何想法讚賞,有點困惑,此刻!

回答

0

爲每個線程創建一個會話並使用session.Load<>()來維護關聯,而無需每次都加載對象。

var data = GetDataForBs(); 

using (var session = OpenSession()) 
using (var tx = session.BeginTransaction()) 
{ 
    foreach (var item in data) 
    { 
     B = ... // create B 
     B.A = session.Load<A>(data.A_Id); // Creates a proxy without loading A to maintain the association 
     session.save(B); 
    } 
    tx.Commit(); 
} 

如果每個實體靠自己而活(不需要級聯),可以使用StatelessSession反而加快速度

+0

一個StatelessSession將是我的情況適合,感謝您的建議。另外,開始並提交事務的好主意是多少次,例如,我應該針對每個單獨的插入還是對多個插入進行分組? –

+0

如果你需要速度,那麼分組更好,如果你不想失去一些插入的情況下提交(例如你不能重複),然後提交每插入 – Firo