如何维护两个nHibernate会话的对象?

时间:2008-11-07 16:56:19

标签: c# multithreading nhibernate

我正在构建一个像这样工作的多线程系统:

虽然有实体:

  1. 从nHibernate获取实体(使用当前会话)

  2. 启动一个可与此实体合作的新线程*

  3. 当我启动这个新线程时,需要有一个新的Session,因为nHibernate不是线程安全的。我创建它,但之前检索的实体不适用于此会话。

    今天我正在解决这种情况,从nHibernate中检索一个传递id的新实体。但这很昂贵,我正在努力节省一些时间来实现我的SLA。

    有没有办法将此对象链接到此新会话而无需进行新的数据库调用?另一个会话将不会关闭,它们都会在应用程序结束之前全部打开。

3 个答案:

答案 0 :(得分:4)

如果您正在处理分离的对象,则必须将它们重新连接到会话。如果您拥有正在使用的对象的正确Hibernate ID,调用get,然后将您的副本与刚刚进入会话的Hibernate合并,则可以执行此操作。但是,请确保使用merge,因为saveOrUpdate()不会删除分离对象中缺少的任何子项,只需添加新子项并将更改保存到现有子项中。

答案 1 :(得分:2)

除了Evict + Lock之外,您还可以使用2:nd级别缓存来重建实体而无需进入数据库。我不知道它是否适合您的应用程序,但我也认为只要第一个线程停止对其进行更改,就可以将会话传递给另一个步骤。

答案 2 :(得分:1)

在连接到另一个线程之后,我将它从第一个线程中分离出来。