質問

現在NHibernateを使用しています。次のように、大量のレコードをデータベースに保存する必要がある状況があります。

var relatedTopics = GetRelatedTopics(topic);
foreach (var relatedTopic in relatedTopics /* could be anywhere from 10 - 1000+ */)
{
    var newRelatedTopic = new RelatedTopic { RelatedTopicUrl = relatedTopic, TopicUrl = topic.Name };
    _repository.Save(newRelatedTopic);
}

保存するレコードが大量にある場合、データベースに何度もアクセスする必要があるのは明らかに非常に負担です。より良いアプローチは何でしょうか?何らかのバッチ更新を行うことはできますか?DataSet を使用したほうがよいでしょうか?

ありがとう

役に立ちましたか?

解決

adonet.batch_size を設定すると状況が改善される可能性があります。

そのためには、次のことを行う必要があります

  • NH 構成で adonet.batch_size を設定します

例:

    m_sessionFactory = Fluently
         .Configure()
         .Database(MsSqlConfiguration
             .MsSql2005
             .ConnectionString(c => c.FromConnectionStringWithKey("testme"))
             )
         .Mappings(m => m.FluentMappings
             .AddFromAssemblyOf<TestImpl>())
         .ExposeConfiguration(config =>
         {
             config.SetProperty("adonet.batch_size", "1");
             m_configuration = config;
         })
         .BuildSessionFactory();
  • 保存直前にセッションのバッチ サイズを設定します。

    using (ISession session = m_nhibernateSessionFactory.GetSession())
    using (var tx = session.BeginTransaction())
    {    
       session.SetBatchSize(1000);     
       foreach (var server in serverz)
       {
          session.SaveOrUpdate(server);
       }
       tx.Commit();
    }
    

他のヒント

私は、これはあなたが探しているものであると信じています:

データの操作とNHibernateはのステートレスセッション

代わりにISessionを開く

基本的に、あなたはIStatelessSessionを開き、あなたのhibernate.cfg.xmlであなたが設定することができます:

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

私はあなたの状況に応じて多くのオプションを持っていると思う。

あなたが利用できる新しい実行HQLを使用しようとすることができNHibernateは2.1アルファを使用することができます。

http://nhibernate.info/blog /2009/05/05/nh2-1-executable-hql.htmlする

トビアスの答えも同様に動作します。ただ、バッチサイズを設定すると、立派パフォーマンスが向上します。

あなたは... ADO.Netで汚れ手にしたい場合は、

、SQL Serverの一括挿入を行うと、SQLのバルク・コピーを使用することにより可能である。

その例はここにある: http://dotnetslackers.com/articles/ado_net/ SqlBulkCopy_in_ADO_NET_2_0.aspxする

あなたは、データベース内の別のエンティティのオフに基づいて、新しいエンティティを作成しているように、

私には思えます。私にとってそれは、ストアドプロシージャを使用するために理想的なシナリオのように思える。

DataSetの?番号。 一括挿入?はいています。

あなたはその多くのレコードを挿入すると、挿入はかなり単純化されている場合は、一括挿入を行うと、ORMを引き出すになっているはずです。

レコードを挿入する最速の方法は、テキストファイルを生成し、ロード・ファイルの構文を使用することです。ほとんどのデータベースは、データベースへのデータファイルをインポートすると非常に高速な実装を持っています。 MySQLの場合、下記参照してください。

http://dev.mysql.com/doc /refman/5.1/en/load-data.htmlする

他のデータベースについては、適切なマニュアルを参照してください。あなたは万レコード、または頻繁に何千ものレコードを挿入する場合に便利です。そうでなければ、あなたができる最善のは、インサートの1000で大きなSQLを作成し、直接データベース接続にそれを実行し、オームズとその関連の検証をスキップされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top