1

大量のデータを返すプロセスがあります(コミット時に50〜100kエンティティのオーダーが必要です)

私は(作業単位パターン)Addの前にすべてのを実行しています。コミットに実際にかかる時間についてはあまりCommit気になりません-プロセスは非常に長時間(数週間)かかるので、ここで1分、または世界の終わりはありませんが、コミット中に、同じ抽象を使用する2番目のアプリケーションエンティティとコンテキストはデータベーステーブルから読み取ることができず、最終的にタイムアウトします。

コミットが発生するまで待って、アプリ#2から再度読み込もうとすると、ほぼ瞬時に機能します。

では、コミット中にテーブルをロックしないようにEFに指示するにはどうすればよいですか(おそらくそれが何をしているのでしょうか?)。

キーコードは次のとおりです。

Dim DBTask = TaskRepository.Single(function(x) x.Id = CurrentTaskId)

''Task is a class which stores the results from the process before committing them
For Each Result In Task.Results
    Dim DbResult = TaskResultRepository.CreateInstance
    DbResult.Field1 = Result.Field1
    DbResult.Field2 = Result.Field2

    DbTask.Results.Add(DbResult)
Next
DbTask.JobStatus = Entities.JobStatuses.Completed
QLog.DebugFormat("Committing Task {1}: {0}", Task.Name, Task.Id)
UnitOfWork.Commit()
Tasks.Remove(Task)
QLog.InfoFormat("End Task {1}: {0}", Task.Name, Task.Id)

さらに悪いことに、私は現在、誰かがSQL Serverインストールディスクを置き忘れたため、Management Studio / Performance Analyserがなく、ServerExplorerだけであるという点でツールが不足しています。

参考までに、私のRepository(Of T As Entitybase).CreateInstance方法は次のとおりです。

Protected ReadOnly Entities As IDbSet(Of T)
Public Function CreateInstance() As T Implements Interfaces.IRepository(Of T).CreateInstance
    Dim Entity = Entities.Create(Of T)()
    With Entity
        .CreatedOn = Now
    End With
    Entities.Add(Entity)
    Return Entity
End Function
4

1 に答える 1

1

問題は、すべてを1つのUOWにインポートしていて、プロセスが完了するまでに数週間かかることです(?)これがタイプミスであり、トランザクションを数週間開いていないことを願っています。1分は長すぎ、1週間はばかげています。

あなたが説明するのはETLの概念です。抽出、変換、読み込み。ここで、データをデータベースに一括でロードしています。これにはEFを使用しています。つまり、小さな作業単位に最適化されたORMを使用しています。これらはETLのツールとして意図されたものではありません。

最初の問題は、ORMを使用してETLを実行することです。データのインポートを管理するには、Rhino.ETLまたはSSISを選択することをお勧めします。2番目の問題は、単一のトランザクション内でインポートするデータの量です。これをチャンクに分割します。一度に1K、5Kのレコードがあります。これにより、スループットが向上し、実際にすべてのデータのインポートにかかる時間が短縮されます。

最後に調整するのは、トランザクションのロックを手動で制御することです。最も制限が厳しく、最も遅いシリアル化レベルのロックが使用されているようです。トランザクションが完了するまで、他に何も発生しません。ReadCommittedは、データが別のプロセスから書き込まれているときに読み取りを実行できる、より優れたロックレベルであることがわかる場合があります。

しかし、EFは別の操作プロセスを制御します。いいえ、それは不可能です。

于 2012-06-19T17:01:05.007 に答える