3

アプリケーションに一括挿入を追加しようとしましたが、Batcher はまだ BatchSize が 1 の NonBatchingBatcher です。

これは、C#3、NH3RC1、MySql 5.1 を使用しています。

これをSessionFactoryに追加しました

<property name="adonet.batch_size">100</property>

そして、私のコードはこのようになります

var session = SessionManager.GetStatelessSession(type);
var tx = session.BeginTransaction();
session.Insert(instance);

問題のインスタンスには HILO ID 生成を使用していますが、データベース上のすべてのインスタンスには使用していません。SessionFactory.OpenStatelessSession は型をとらないため、この型でバッチ処理を実行できるかどうかを実際に認識できませんか、それとも...?

NHibernate を掘り下げた後、SettingsFactory.CreateBatcherFactory で追加情報を提供する可能性のあるものを見つけました。

// It defaults to the NonBatchingBatcher
System.Type tBatcher = typeof (NonBatchingBatcherFactory);

// Environment.BatchStrategy == "adonet.factory_class", but I haven't
// defined this in my config file
string batcherClass = PropertiesHelper.GetString(Environment.BatchStrategy, properties, null);
if (string.IsNullOrEmpty(batcherClass))
{
    if (batchSize > 0)
    {
        // MySqlDriver doesn't implement IEmbeddedBatcherFactoryProvider,
        // so it still uses NonBatchingFactory
        IEmbeddedBatcherFactoryProvider ebfp = connectionProvider.Driver as IEmbeddedBatcherFactoryProvider;

構成が間違っている可能性はありますか?

  <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
    <session-factory name="my application name">
      <property name="adonet.batch_size">100</property>
      <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
      <property name="connection.connection_string">my connection string
      </property>
      <property name="dialect">NHibernate.Dialect.MySQL5Dialect</property>
      <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
      <!-- To avoid "The column 'Reserved Word' does not belong to the table : ReservedWords" -->
      <property name="hbm2ddl.keywords">none</property>
    </session-factory>
  </hibernate-configuration>
4

3 に答える 3

3

この質問は 1 年前のものですが、MySQL のバッチ処理機能を NHibernate に追加する NuGet パッケージがあります。それが NHibernate に直接組み込まれていない理由は、機能には MySQL.Data アセンブリへの参照が必要であり、開発チームは依存関係を望んでいないためです。

于 2012-03-22T19:47:58.170 に答える
2

IIRC、バッチ処理は現在、OracleおよびSqlServerでのみサポートされています。

NHの他のほとんどの側面と同様に、これは拡張可能であるため、独自のIBatcher/を記述し、IBatcherFactory構成を介してそれらを注入できます。

補足:NHの現在のバージョンは3.0GAです。

于 2011-01-18T17:38:02.153 に答える
0

本当に古い質問ですが...完全に正しくしましょう

バッチ処理が機能しないもう 1 つの理由は、(あなたの場合のように) ステートレス セッションを使用することです。ステートレス セッションはバッチ処理をサポートしていません。ドキュメントから:

StatelessSession インターフェイスによって定義された insert()、update()、および delete() 操作は、データベースの行レベルの直接操作と見なされ、それぞれ SQL INSERT、UPDATE、または DELETE が即座に実行されます。したがって、それらは、ISession インターフェイスによって定義された Save()、SaveOrUpdate()、および Delete() 操作とは非常に異なるセマンティクスを持っています。

于 2016-05-04T08:33:46.610 に答える