database - NHibernate 多线程 session 管理

标签 database hibernate nhibernate web-scraping single-user

我遇到的情况涉及多个线程同时使用从 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/

相关文章:

nhibernate - 为什么许多 nHibernate 示例代码实例都包含 CaSTLe dll?

java - 为什么当我在 SQLite 中登录页面时我的页面自动关闭?

ruby-on-rails - rails 中数据修复的最佳替代方案?

java - 有没有办法访问 Hibernate 中的子字段?

java - 如何实现一个通用的方法来使用 Hibernate 从数据库中获取数据?

c# - NHibernate 正在将我的收藏变成只读。我怎样才能阻止它?

nhibernate - 在 NHibernate 中搜索多列

MySQL update table set count = count +1 并发问题

java - 读取paradox DBF文件并导入H2数据库

java - HQL diff 2 以天为单位的日期