• 踩坑了!踩坑了!NHibernate使用批量插入Oracle数据,Batch属性


    今天看NHibernate文档,发现了NHibernate提供批量操作数据的支持,目前仅支持sql server和Oracle,果断要试试啊。结果发现,竟然批量插入Oracle数据无效。以下是我的hbm配置文件内容。

     1 <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2">
     2     <session-factory name="NHibernate.Test">
     3         <property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
     4         <property name="connection.connection_string">
     5             User ID=test;Password=test001;Data Source=172.17.41.10/orcl
     6         </property>
     7         <!--启动批量操作,可有效减少nh与数据库的连接。设置为0时,默认不启动-->
     8         <property name="adonet.batch_size">10</property>
     9         <property name="show_sql">true</property>
    10         <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
    11         <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    12         <mapping assembly="Domain"/><!--用于加载实体映射文件所在的程序集-->
    13     </session-factory>
    14 </hibernate-configuration>

    以上,我以为就结束了,

     1 using (ITransaction rs = session.BeginTransaction())
     2                 {
     3                 //正确的开始了批量,这里应该只连接了2次数据库才对。
     4                     for (var k = 0; k <= 20; k++)
     5                     {
     6                         TplCustomer tplCustomer = new TplCustomer()
     7                         {
     8                             FirstName = "孙悟空"+k,
     9                             LastName = "KIng"+k
    10                         };
    11                         session.Save(tplCustomer);
    12                     }
    13                     rs.Commit();
    14                     //var model = session.Get<TplCustomer>(151228);
    15                     //session.Delete(model);
    16                     session.Close();
    17                 }

    结果,很明现,它并没有实现预想中的批量操作:

    坑点一:Nhibernate中的批量操作,不支持实体id生成策略是IDENTITY类型的主键(IDENTITY类型主键,会发现该策略生成的主键id,在插入语句之前,每次都要计算下一条主键的值。因此BatchSize无法进行分组优化),而只支持UNIQUEIDENTIFIER类型的主键,即GUID类型。

      在Oracle中,UNIQUEIDENTIFIER类型对应的是Raw(16)数据类型。实体和映射配置如下说明:

    1 public class TplCustomer {
    2         public virtual Guid SeqId { get; set; }
    <class name="TplCustomer" table="TPL_CUSTOMER" lazy="true" >
          <id name="SeqId" column="SEQ_ID">
              <!--主键生成策略-->
              <!--<generator class="sequence">
                  <param name="sequence">SEQ_CLERK</param>
              </generator>-->
              <!--使用GUID作为主键值-->
              <generator class="guid"/>
          </id>
        <!--<property name="Version">
          <column name="VERSION" sql-type="VARCHAR2" not-null="false" unsaved-value="0"/>
        </property>-->
         <!--unsaved-value临时状态值-->
        <version name="Version" type="int" column="VERSION"  unsaved-value="0"/>

    配置完如上,使用了GUID策略生成主键,是否就可以进行batch分组优化了呢。答案是否定的/这里引入一篇博文,https://blog.csdn.net/weixin_33973600/article/details/93832921。大神告诉我们,在NHibernate中,我们需要使用Oracle.DataAcess。在oracle10g中,怎么使用Oracle.DataAccess。这里引入另外一篇参考博文:https://www.cnblogs.com/iampkm/archive/2012/06/14/2549002.html。这里我就简单的加入我的配置,和实现效果。我这里主要修改的是配置connection.driver_class的地方,将NHibernate.Driver.OracleClientDriver修改成NHibernate.Driver.OracleDataClientDriver即可。

     1 hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2">
     2     <session-factory name="NHibernate.Test">
     3         <property name="connection.driver_class">NHibernate.Driver.OracleDataClientDriver</property>
     4         <property name="connection.connection_string">
     5             User ID=hefeihouselease;Password=hefeihouselease001;Data Source=172.17.41.10/orcl
     6         </property>
     7         <!--启动批量操作,可有效减少nh与数据库的连接。设置为0时,默认不启动-->
     8         <property name="adonet.batch_size">10</property>
     9         <property name="show_sql">true</property>
    10         <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
    11         <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    12         <mapping assembly="Domain"/><!--用于加载实体映射文件所在的程序集-->
    13     </session-factory>
    14 </hibernate-configuration>

    以上,就完美处理了NH的批量操作问题,实现了batch的优化。

  • 相关阅读:
    着手写windows下的c语言这本书。
    ASP.NET Web页生命周期和执行的方法
    Windows 控制面板调用命令
    C# 可指定并行度任务调度器
    .NET 实用扩展方法
    C# 读写锁
    WinForm中预览Office文件
    C#方法过滤器
    WinForm动态查询
    .NET ActiveMQ类库
  • 原文地址:https://www.cnblogs.com/king-tao/p/13390373.html
Copyright © 2020-2023  润新知