我需要在一个事务中注册多个NHibernate会话。目前我是这样做的:
1. 创建SQL连接dbConn; 2. 调用ISessionFactory.OpenSession(dbConn)创建第一个会话; 3. 调用session.BeginTransaction()开始一个事务; 4. 代码后面,我使用相同的连接创建了一个新会话: ISession session2 = ISessionFactory.OpenSession(dbConn)
当我尝试对session2运行任何查询时,我收到以下错误消息: ExecuteReader要求命令在待定本地事务中的连接具有事务。命令的Transaction属性未初始化。
尽管NHibernate重用了相同的连接,但它似乎没有将第二个ISession(或更具体地说,为该会话创建的Command对象)注册到开放事务中。
有没有办法在同一事务中拥有多个会话?
我不能使用单个会话,因为我有一个长时间运行的任务,加载并创建超过100万个对象。如果我使用一个ISession,则性能从每秒3000个数据库请求降至20个,因为NHibernate刷新的性能下降。为了解决这个问题,我想创建短暂的会话并快速处理它们。
然而,整个过程都包装在一个事务中。如果我使用自己的连接创建独立的后续会话,则会与第一个事务持有的表锁冲突并被冻结。为了解决这个问题,我需要在同一个事务中运行这些会话。
1. 创建SQL连接dbConn; 2. 调用ISessionFactory.OpenSession(dbConn)创建第一个会话; 3. 调用session.BeginTransaction()开始一个事务; 4. 代码后面,我使用相同的连接创建了一个新会话: ISession session2 = ISessionFactory.OpenSession(dbConn)
当我尝试对session2运行任何查询时,我收到以下错误消息: ExecuteReader要求命令在待定本地事务中的连接具有事务。命令的Transaction属性未初始化。
尽管NHibernate重用了相同的连接,但它似乎没有将第二个ISession(或更具体地说,为该会话创建的Command对象)注册到开放事务中。
有没有办法在同一事务中拥有多个会话?
我不能使用单个会话,因为我有一个长时间运行的任务,加载并创建超过100万个对象。如果我使用一个ISession,则性能从每秒3000个数据库请求降至20个,因为NHibernate刷新的性能下降。为了解决这个问题,我想创建短暂的会话并快速处理它们。
然而,整个过程都包装在一个事务中。如果我使用自己的连接创建独立的后续会话,则会与第一个事务持有的表锁冲突并被冻结。为了解决这个问题,我需要在同一个事务中运行这些会话。
ISession.GetSession(EntityMode.Poco)
。已修复。 - Firo