NHibernate ISession刷新:何时何地使用它,为什么?

让我彻底困惑的一件事是使用session.Flush ,与session.Commitsession.Close一起使用。

有时session.Close可以工作,例如,它会提交我需要的所有更改。 我知道当我有一个事务时需要使用提交,或者有多个创建/更新/删除的工作单元,以便在发生错误时选择回滚。

但有时我真的被session.Flush背后的逻辑所session.Flushsession.Flush 。 我已经看到你有一个session.SaveOrUpdate()例子session.SaveOrUpdate()后跟一个刷新,但是当我删除刷新它无论如何工作正常。 有时候我在Flush语句中遇到错误,说会话超时,删除它确保我没有遇到那个错误。

有没有人有一个很好的指导方针,以便在何时何地使用Flush? 我已经检查了NHibernate的文档,但我仍然无法找到一个简单的答案。


简述:

  • 始终使用交易
  • 不要使用Close() ,而不是包装上的通话ISession一个内部using的语句或管理您的ISession其他地方的生命周期
  • 从文档:

    有时, ISession将执行将ADO.NET连接的状态与内存中的对象状态同步所需的SQL语句。 这个过程,刷新,默认情况下发生在以下几点

  • Find()Enumerable()一些调用中,
  • 来自NHibernate.ITransaction.Commit()
  • 来自ISession.Flush()
  • SQL语句按以下顺序发布

  • 所有实体插入,以相同的顺序使用ISession.Save()保存相应的对象
  • 所有实体更新
  • 所有集合删除
  • 所有集合元素删除,更新和插入
  • 所有集合插入
  • 所有的实体删除,以相同的顺序使用ISession.Delete()删除相应的对象
  • (使用本地ID生成的对象在保存时会插入一个例外。)

    除非你明确Flush() ,否则绝对不能保证Session何时执行ADO.NET调用,只有执行它们的顺序 。 但是,NHibernate确保ISession.Find(..)方法永远不会返回陈旧的数据; 也不会返回错误的数据。

    可以更改默认行为,以便更频繁地进行刷新。 FlushMode类定义了三种不同的模式:只在提交时刷新(并且仅在使用NHibernate ITransaction API时),使用已解释的例程自动刷新,或者不会刷新,除非明确调用Flush() 。 最后一种模式对长时间运行的工作单元非常有用,其中ISession保持打开状态并长时间断开连接。

    ...

    另请参阅本节:

    结束会议涉及四个不同的阶段:

  • 刷新会话
  • 提交交易
  • 关闭会议
  • 处理异常
  • 冲洗会议

    如果您碰巧使用ITransaction API,则无需担心此步骤。 当事务被提交时,它将被隐含地执行。 否则,您应该调用ISession.Flush()以确保所有更改都与数据库同步。

    提交数据库事务

    如果您使用的是NHibernate ITransaction API,则如下所示:

    tx.Commit(); // flush the session and commit the transaction
    

    如果您自己管理ADO.NET事务,则应该手动执行Commit() ADO.NET事务。

    sess.Flush();
    currentTransaction.Commit();
    

    如果您决定不提交更改:

    tx.Rollback();  // rollback the transaction
    

    要么:

    currentTransaction.Rollback();
    

    如果你回滚事务,你应该立即关闭并放弃当前会话,以确保NHibernate的内部状态是一致的。

    关闭ISession

    ISession.Close()调用标志着会话结束。 Close()的主要含义是ADO.NET连接将被会话放弃。

    tx.Commit();
    sess.Close();
    
    sess.Flush();
    currentTransaction.Commit();
    sess.Close();
    

    如果您提供了自己的连接,则Close()将返回对其的引用,以便您可以手动关闭它或将其返回到池。 否则, Close()将其返回到池中。


    从NHibernate 2.0开始,数据库操作需要事务。 因此, ITransaction.Commit()调用将处理任何必要的刷新。 如果由于某种原因你没有使用NHibernate事务,那么将不会自动刷新会话。


    有时,ISession将执行将ADO.NET连接的状态与内存中的对象状态同步所需的SQL语句。

    并始终使用

     using (var transaction = session.BeginTransaction())
     {
         transaction.Commit();
     }
    

    在提交更改之后,将此更改保存到数据库中,我们使用transaction.Commit();

    链接地址: http://www.djcxy.com/p/23229.html

    上一篇: NHibernate ISession Flush: Where and when to use it, and why?

    下一篇: How to determine a Python variable's type?