2

Q:

2週間前に次の問題に直面しましたが、パフォーマンスの問題、データの整合性を考慮して、どのように対処すればよいかわかりません。

私がしていることは:

XMLファイルからデータベース内の同様のテーブルにデータを移行したいと思います。

例えば ​​:

  • 私は2つのノード(XMLファイル)を持っています:

    coursesteachers

  • 2つのテーブル(データベース)

    coursesteachers

ユーザーがXMLファイルをサーバー上のフォルダーにアップロードできるようにし、XMLファイルの読み取りを開始して、データベースにデータを挿入します。

問題は:

挿入操作中に何らかの障害が発生した場合、すべてのテーブルに挿入されたすべてのレコードを削除(またはロールバック)したいと思います。

私は考え始めますtransaction、各エンティティの挿入はトランザクションを通じて実行されますが、私は2つの問題に直面します:

  1. アップローダーごとに、すべてのエンティティのすべての挿入を1つのトランザクションに入れるか、1つのエンティティを1つずつトランザクションに入れる必要がありますか?(すべてのエンティティデータをすべて挿入するか、挿入しない必要があります)。

  2. 膨大な数のレコードがある場合(1500レコード)、次の例外が表示されます。

    このIfxTransactionは完了しました。それはもはや使用できません、誰もそれを修正しません。

  3. 私のチームリーダーは、トランザクションを使用しないように言いました。これは、テーブルがロックされ、多くのユーザーがそれらのテーブルを使用するためです。彼は他のメカニズムを望んでいます。

私の問題の解決策(詳細な説明)、このケースを処理し、パフォーマンスの問題とデータの整合性と一貫性を維持する方法を教えてください。

4

3 に答える 3

2

これは、同じ問題で使用したメカニズムです。一時テーブルへのデータの保存を開始し、一時テーブルに挿入した後に例外がない場合は、これらの一時テーブルの内容を実際のテーブルにコピーするストアドプロシージャを実行し、その後、一時テーブルから*を削除します。このようにして、トランザクションメカニズムを使用するときにテーブルへのアクセスをロックしません。別のメカニズムがありますが、それを使用する場合は、すべてのデータベース構造を再考する必要があります。これはCQRSと呼ばれます(.NETの場合はNCQRSと呼ばれるAPIがあります)

于 2011-08-24T17:25:31.643 に答える
1

SqlBulkCopyを使用することをお勧めします。あなたはグーグルするか、これらの2つの記事を読むことができます:

  1. http://blogs.msdn.com/b/nikhilsi/archive/2008/06/11/bulk-insert-into-sql-from-c-app.aspx
  2. http://www.dotnetcurry.com/ShowArticle.aspx?ID=323
于 2011-07-28T16:50:57.887 に答える
1

私がこれを正しく理解していれば、あなたはバッチ挿入を行っています。最後の障害点からの再起動、再試行、チャンキング、データのパーティション化などの機能を備えたSpringBatchを使用してみませんか。

asp.netにタグを付けていることは承知していますが、データの読み込みはテクノロジーに依存しない方法と分離された方法で発生する可能性があります。ではない?

于 2011-08-30T07:02:21.553 に答える