NHibernate多线程会话管理



我有一个情况,涉及多个线程同时用从web数据源抓取的数据填充数据库。刮削器将定期运行以从各种来源收集新数据。

我刚开始使用NHibernate,不完全确定如何最好地管理会话。

每个worker的工作示例:

  • 从web源中抓取实体A
  • 删除与A相关的每个实体B,并记录A有另一个B(即A有多个B, B有一个A)

为了持久化每个B,会话需要对a的引用来创建B,然后a需要将B添加到它的子列表中。然后A和B都被持久化。

在这种a -B子-父情境中存在一个层次结构,例如a有很多B, B有很多C…在叶级,A有成千上万的叶子节点,所以在这个链上一直保持会话打开是不切实际的。

另一种方法是记录链下每个父节点的标识符(可以独立于会话存储),并在每次需要创建子节点时通过此id加载父节点。

我也明白,一个ISession意味着是单线程的,所以我将需要在每个线程至少一个会话,但除此之外,我真的不确定最好的方法?

任何想法都很感激,现在有点困惑!

为每个线程创建一个会话,并使用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来加快速度

最新更新