当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《NHibernateISessionFlush:何时何地使用它,为什么?》经验,为你挑选了2个好方法。

令我彻底混淆的一件事是使用session.Flush,和session.Commit,和session.Close.

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

但有时我真的被后面的逻辑所困扰session.Flush.我已经看到了一些示例,其中有一个session.SaveOrUpdate()后续的同花顺,但是当我删除Flush时它无论如何都能正常工作.有时我在Flush语句中遇到错误,说会话超时,并删除它确保我没有遇到该错误.

有没有人有关于何时何地使用同花顺的良好指导方针?我已经检查了NHibernate文档,但我仍然找不到简单的答案.



1> Matt Hinze..:

简述:

    始终使用交易

    不要使用Close(),而是将调用包装ISessionusing语句内部或管理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()显式调用.最后一种模式对于长时间运行的工作单元很有用,其中ISessiona长时间保持打开和断开状态.

...

另请参阅本节:

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

刷新会话

提交交易

关闭会议

处理异常

刷新会话

如果您碰巧使用ITransactionAPI,则无需担心此步骤.它将在提交事务时隐式执行.否则,您应该调用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()将其返回池中.


对我来说,这一行很关键:"Close()的主要含义是会话将放弃ADO.NET连接." 如果你不调用ISession.Close(),你的连接将被填满,直到你获得db超时.:○

2> Sean Carpent..:

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

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有