Nhibernate sessionPerThread
Nhibernate sessionPerThread
我同时在多个线程中创建实体。
当我按顺序(使用一个线程)执行此操作时,一切都很好,但是当我引入并发时,几乎总是有新的异常。
我异步调用这个方法:
public void SaveNewData(){
....DO SOME HARD WORK....
var data = new Data
{
LastKnownName = workResult.LastKnownName
MappedProperty = new MappedProperty
{
PropertyName = "SomePropertyName"
}
};
m_repository.Save(data);
}
我已经得到这个异常:
a different object with the same identifier value was already
associated with the session: 3, of
entity:TestConcurrency.MappedProperty
还有这个:
Flushing during cascade is dangerous
当然还有我最喜欢的:
Session is closed!Object name: 'ISession'.
我认为发生的事情是:每个线程都有相同的会话 (nhibernateSession) 然后它...出错了,因为所有内容都尝试使用相同的会话发送查询。
对于 nhibernate 配置,我将 NhibernateIntegration 与温莎城堡结合使用。
m_repository.Save(数据) 看起来像:
public virtual void Save(object instance)
{
using (ISession session = m_sessionManager.OpenSession())
{
Save(instance, session);
}
}
其中 m_sessionManager 从 Castle 注入到构造函数中,它是 ISessionManager。有什么方法可以强制此 ISessionManager 给我 SessionPerThread 或任何其他并发会话处理?
所以我研究了一下,NHibernateIntengrationFacility 似乎不支持开箱即用的事务管理。
当我更改为取代 Castle.NHibernateIntegration 的新 Castle.NHibernate.Facility 时我解决了这个问题 - 请注意,这目前只是测试版。
Castle.Nhibernate.Facility支持session-per-transaction管理,彻底解决了我的问题
我同时在多个线程中创建实体。 当我按顺序(使用一个线程)执行此操作时,一切都很好,但是当我引入并发时,几乎总是有新的异常。
我异步调用这个方法:
public void SaveNewData(){
....DO SOME HARD WORK....
var data = new Data
{
LastKnownName = workResult.LastKnownName
MappedProperty = new MappedProperty
{
PropertyName = "SomePropertyName"
}
};
m_repository.Save(data);
}
我已经得到这个异常:
a different object with the same identifier value was already associated with the session: 3, of entity:TestConcurrency.MappedProperty
还有这个:
Flushing during cascade is dangerous
当然还有我最喜欢的:
Session is closed!Object name: 'ISession'.
我认为发生的事情是:每个线程都有相同的会话 (nhibernateSession) 然后它...出错了,因为所有内容都尝试使用相同的会话发送查询。
对于 nhibernate 配置,我将 NhibernateIntegration 与温莎城堡结合使用。
m_repository.Save(数据) 看起来像:
public virtual void Save(object instance)
{
using (ISession session = m_sessionManager.OpenSession())
{
Save(instance, session);
}
}
其中 m_sessionManager 从 Castle 注入到构造函数中,它是 ISessionManager。有什么方法可以强制此 ISessionManager 给我 SessionPerThread 或任何其他并发会话处理?
所以我研究了一下,NHibernateIntengrationFacility 似乎不支持开箱即用的事务管理。
当我更改为取代 Castle.NHibernateIntegration 的新 Castle.NHibernate.Facility 时我解决了这个问题 - 请注意,这目前只是测试版。
Castle.Nhibernate.Facility支持session-per-transaction管理,彻底解决了我的问题