3

我的情况涉及多个线程同时使用从 Web 源中抓取的数据填充数据库。刮板将定期运行以从各种来源收集新数据。

我是使用 NHibernate 的新手,不完全确定如何最好地管理会话。

每个工人做什么的一个例子:

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

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

这种AB子父级的情况有一个层次结构,A有很多B,B有很多C......在叶子级别,A有数千个叶子孩子,所以保持会话是不切实际的(?)沿着这条链一路打开。

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

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

任何想法表示赞赏,目前有点困惑!

4

1 回答 1

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 来加快速度

于 2011-12-08T08:54:32.790 回答