我正在构建一个像这样工作的多线程系统:
虽然有实体:
从nHibernate获取实体(使用当前会话)
启动一个可与此实体合作的新线程*
当我启动这个新线程时,需要有一个新的Session,因为nHibernate不是线程安全的。我创建它,但之前检索的实体不适用于此会话。
今天我正在解决这种情况,从nHibernate中检索一个传递id的新实体。但这很昂贵,我正在努力节省一些时间来实现我的SLA。
有没有办法将此对象链接到此新会话而无需进行新的数据库调用?另一个会话将不会关闭,它们都会在应用程序结束之前全部打开。
答案 0 :(得分:4)
如果您正在处理分离的对象,则必须将它们重新连接到会话。如果您拥有正在使用的对象的正确Hibernate ID,调用get,然后将您的副本与刚刚进入会话的Hibernate合并,则可以执行此操作。但是,请确保使用merge,因为saveOrUpdate()不会删除分离对象中缺少的任何子项,只需添加新子项并将更改保存到现有子项中。
答案 1 :(得分:2)
除了Evict + Lock之外,您还可以使用2:nd级别缓存来重建实体而无需进入数据库。我不知道它是否适合您的应用程序,但我也认为只要第一个线程停止对其进行更改,就可以将会话传递给另一个步骤。
答案 2 :(得分:1)
在连接到另一个线程之后,我将它从第一个线程中分离出来。