12

現在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 を使用した方がよいでしょうか?

ありがとう

4

5 に答える 5

16

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();
    }
    
于 2009-06-11T16:54:52.300 に答える
5

これがあなたが探しているものだと思います:

NHibernate のステートレス セッションを使用した一括データ操作

基本的に、ISession を開く代わりに、IStatelessSession を開き、hibernate.cfg.xml で次のように設定できます。

 <property name="adonet.batch_size">100</property>
于 2009-06-11T19:21:20.373 に答える
3

状況に応じて、いくつかの選択肢があると思います。

NHibernate 2.1 alpha を使用できる場合は、利用可能な新しい Executable HQL を使用してみることができます。

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

トバイアスの答えも同様に機能します。バッチサイズを設定するだけで、パフォーマンスが大幅に向上します。

ADO.Net で手を汚したい場合は...

Sql Server での一括挿入は、Sql Bulk Copy を使用して行うことができます。

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

私には、データベース内の別のエンティティに基づいて新しいエンティティを作成しているようです。私には、ストアド プロシージャを使用する理想的なシナリオのように思えます。

于 2009-06-11T17:14:42.457 に答える
1

レコードを挿入する最も速い方法は、テキスト ファイルを生成し、LOAD FILE 構文を使用することです。ほとんどのデータベースでは、データ ファイルをデータベースにインポートするための実装が非常に高速です。MySQL については、以下を参照してください。

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

その他のデータベースについては、該当するマニュアルを参照してください。これは、100 万件または数千件のレコードを頻繁に挿入する場合に便利です。それ以外の場合は、何千もの挿入を含む大きな SQL を作成し、それをデータベース接続で直接実行して、ORM とそれに関連する検証をスキップすることをお勧めします。

于 2009-06-11T17:11:28.343 に答える
1

データセット? いいえ、一括挿入しますか? はい。

多くのレコードを挿入していて、挿入が非常に単純な場合は、一括挿入を実行して ORM を引き出すことを検討する必要があります。

于 2009-06-11T16:57:43.370 に答える