NHibernate2.1中Flush的调用模式(转自http://blog.csdn.net/nileel/archive/2009/09/23/4583652.aspx)

本文主要是介绍NHibernate2.1中Flush的调用模式(转自http://blog.csdn.net/nileel/archive/2009/09/23/4583652.aspx),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有很多NHibernate的初学者搞不清Flush()这个方法调用的时机和策略。

事实上,ISession有个叫FlushMode的属性,对其赋值即可控制调用Flush()的时机和策略。

那么具体赋什么值对应什么策略呢?NHibernate提供了一个枚举类型。其代码和注释如下:

using System;

namespace NHibernate
{
    // 摘要:
    //     Represents a flushing strategy.
    //
    // 备注:
    //     The flush process synchronizes database state with session state by detecting
    //     state changes and executing SQL statements
    //刷出通过检测状态变化和执行SQL状态来处理数据库状态与session状态之间的同步
    [Serializable]
    public enum FlushMode
    {
        // 摘要:
        //     Special value for unspecified flush mode (like null in Java).
        Unspecified = -1,
        //
        // 摘要:
        //     The ISession is never flushed unless Flush() is explicitly called by the
        //     application. This mode is very efficient for read only transactions
        //ISession(工作单元)绝不会被刷出除非应用程序明确地调用Flush()。这个模式对只读事务非常高效
        Never = 0,
        //
        // 摘要:
        //     The ISession is flushed when Transaction.Commit() is called
        //当Transaction.Commit()被调用时ISession(工作单元)会被刷出
        Commit = 5,
        //
        // 摘要:
        //     The ISession is sometimes flushed before query execution in order to ensure
        //     that queries never return stale state. This is the default flush mode.
        //查询执行前ISession(工作单元)会被不定时的刷出以确保查询绝不返回无效状态。这是默认的刷出模式
        Auto = 10,
        //
        // 摘要:
        //     The NHibernate.ISession is flushed before every query. This is almost always
        //     unnecessary and inefficient.
        //ISession(工作单元)在每个查询执行前被刷出。这个模式通常情况下几乎不需要并且效率非常低
        Always = 20,
    }
}

从以上代码和注释,我们可以很容易找到我们需要的答案。

中文注释部分为本人所翻译,E文水平有限,有什么不到位之处欢迎批评指正。

在默认的FlushMode下,flush() 会在下面的时间点执行:

  • 在某些Find() 或者Enumerable() 调用的时候

  • NHibernate.ITransaction.Commit() 的时候

  • ISession.Flush() 的时候

涉及的SQL语句会按照下面的顺序安排:

  1. 所有对实体进行插入的语句,其顺序按照对象执行ISession.Save() 的时间顺序

  2. 所有对实体进行更新的语句

  3. 所有进行集合删除的语句

  4. 所有对集合元素进行删除,更新或者插入的语句

  5. 所有进行集合插入的语句

  6. 所有对实体进行删除的语句,其顺序按照对象执行ISession.Delete() 的时间顺序

(有一个例外时,如果对象使用native 方式进行 ID 生成的话,它们一执行save就会被插入。)

除非你明确地发出了Flush() 指令,关于 ISession 合时会执行这些ADO.NET调用是完全无法保证的,只能保证它们执行的前后顺序。 当然,NHibernate保证, ISession.Find(..) 绝对不会返回已经失效的数据,也不会返回错误数据。

本来是想收藏的,但收藏后就再找就不太好找了。就直接转载。

这篇关于NHibernate2.1中Flush的调用模式(转自http://blog.csdn.net/nileel/archive/2009/09/23/4583652.aspx)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948787

相关文章

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示