一度に 1000 以上のレコードをデータベースに保存
-
13-09-2019 - |
質問
現在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を作成し、直接データベース接続にそれを実行し、オームズとその関連の検証をスキップされます。