我有一个情况,涉及多个线程同时用从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来加快速度