5

Excelシートを読んでビジネスロジックを適用していて、を使用して挿入しようとしてLinq to SQLいます。

私のループでは、挿入する必要が> (greater than) 5,000 recordsあります。< (Less than) 15,000 records

public List<tblLog> tblLogList = new List<tblLog>(); 

このメソッドはループ内にあります:

public void SaveLog()
{
    tblLog tnlog = new tblLog();
    tnlog.id = Guid.NewGuid();
    tnlog.comp_id = Comp_id;
    tnlog.branch_id = Branch_id;
    tnlog.row_id = rowID;
    tnlog.his_id = his_id;
    
    //Add records to List
    tblLogList.Add(tnlog);

以前、このコードを 1 つずつ送信しようとしました。

    //_trContext.tblLogs.InsertOnSubmit(tblLog);
    //_trContext.SubmitChanges();

パフォーマンスヒットのため、私はに変更InsertOnSubmitしましたInsertAllOnSubmit

    if (tblLogList.Count >= 1000)
    {
         _trContext.tblLogs.InsertAllOnSubmit(tblLogList);
         _trContext.SubmitChanges();
         tblLogList.Clear();
    }
}

ここで私の質問は次のとおりです。

  1. Linq to Sql で InserAllOnSubmit() を介して挿入できるレコードの最大数は何ですか。

  2. 上記のコードを使用して、最大 1000 レコードを達成しましたが、コードが 10,000 以上のレコードをTimeout Exception処理している間は、**windows service**.

    上記のロジックを処理するための最良の提案は何でしたか。

前もって感謝します。

4

3 に答える 3

5

他の人は、このタスクにはより良い解決策があると正しく述べていますが、あなたの質問に対する直接的な回答はまだ与えられていません.

答えは、技術的には、これらの新しいオブジェクトをすべて飲み込むことによってコンテキストが消費するメモリの量、またはデータベース トランザクション ログの最大サイズによって制限されるということです。前者がボトルネックになる可能性がはるかに高くなりますが、数百または数千のチャンクでレコードをコミットし、バッチごとに新しいコンテキスト (!) を使用することで、両方の制限に達するのを防ぐことができます。

あなたが言ったように、実際の制限はコマンドのタイムアウトになる可能性があります(それを永遠にしたくない場合)。これも、バッチでコミットし、バッチごとに新しいコマンドを開始することで回避できます。

機能制限は、プロセスが無人であるかどうか (忍耐) や、データが一定時間内に利用可能であると予想されるかどうかなどによって異なります。これらの要件が厳しい場合は、他の回答で提案されているソリューションのいずれかに頼らなければならない場合があります。

于 2013-06-20T18:01:24.627 に答える
3

そのボリュームでは、おそらく DataTable を介して、またはおそらく FastMember の ObjectReader API を介して SqlBulkCopy を使用し、SqlBulkCopy へのフィードに適した型オブジェクトのリストから IDataReader を作成します。

于 2013-06-20T16:06:49.390 に答える
2

仕事に間違ったツールを使用しています。LINQ-to-SQL およびその他のほとんどの ORM はOLTP用です。ここでは OLTP を行っていません。「一括」挿入ETLを行っています。SqlBulkCopy専用のフレームワークなどの適切なツールを使用してください。

于 2013-06-20T16:07:25.457 に答える