gpt4 book ai didi

database - NHibernate 多线程 session 管理

转载 作者:搜寻专家 更新时间:2023-10-30 19:53:56 25 4
gpt4 key购买 nike

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

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

每个 worker 的工作示例:

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

要保留每个 B, session 需要引用 A 来创建 B,然后 A 需要将 B 添加到其子项列表中。然后 A 和 B 都被持久化。

这种 A-B 子父关系的情况存在层次结构,例如 A 有很多 B,B 有很多 C...在此链中一直保持 session 打开。

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

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

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

最佳答案

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

关于database - NHibernate 多线程 session 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8424273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com