简体   繁体   English

nHibernate批处理大小不起作用

[英]nHibernate batch-size doesn't work

I've got a problem with batch-size in nHibernate(C# - VS 2012). 我在nHibernate(C#-VS 2012)中出现批处理大小问题。 I set "batch-size" in the collection and in the config, but it doesn't work. 我在集合和配置中设置了“批量大小”,但是它不起作用。

using (var s = OpenSession())
        {
            using (var t = s.BeginTransaction())
            {                   
                Parent parent = s.CreateCriteria(typeof(Parent)).List<Parent>().First();
                Console.Write(parent.Children[0]);
                t.Commit();
            }
        }

nHibernate profiler shows that it takes all children at once (for example 1000 children), but it should take only 5. nHibernate探查器显示它一次可以带走所有孩子(例如1000个孩子),但是只需要5个孩子。

Parent.hbm.xml: Parent.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="L6.Model" assembly="L6">
  <class name="Parent">
    <id name="ParentId">
      <generator class="native" />
    </id>
    <bag name="Children" batch-size="5">
      <key column="ID_Parent"/>
      <one-to-many class="Child"/>
    </bag>
  </class>
</hibernate-mapping>

Child.hbm.xml: Child.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="L6.Model" assembly="L6">
  <class name="Child">
    <id name="ChildId">
      <generator class="native" />
    </id>
    <many-to-one name="Parent" column="ID_Parent" class="Parent" />
  </class>
</hibernate-mapping>

hibernate.cfg.xml hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 
This template was written to work with NHibernate.Test.
Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it 
for your own use before compile tests in VisualStudio.
-->
<!-- This is the System.Data.dll provider for SQL Server -->
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        <property name="connection.connection_string">
            Server=.;initial catalog=Lista6;Integrated Security=SSPI
        </property>
    <property name="adonet.batch_size">5</property>
        <property name="show_sql">true</property>
        <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
        <property name="command_timeout">60</property>
        <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    <property name="generate_statistics">true</property>
    <mapping file="Child.hbm.xml" />
    <mapping file="Parent.hbm.xml" />
  </session-factory>
</hibernate-configuration>  

Do you have any ideas why batch-size doesn't work? 您有什么想法为什么批量大小不起作用?

You misunderstood what batch-size means. 您误解了batch-size含义。

It means it will read 5 COLLECTIONS OF Children at once, not that it will load 5 elements of the collection. 这意味着它将一次读取5个COLLECTIONS OF Children ,而不是它将加载该集合的5个元素。

adonet.batch_size , on the other hand, means that insert/update/delete statements will be sent in groups of that size in order to have less roundtrips. 另一方面, adonet.batch_size意味着将以该大小的组发送插入/更新/删除语句,以减少往返次数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM