2011-12-07 184 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