Dapperを使用したOleDbConnection.QueryのSystem.AccessViolationException

.net c# dapper oledb vb.net

質問

私は.Net 4.0でOleDbConnectionを使用して、ACE OleDb 12.0エンジンでMicrosoft Access 2010データベースを照会しています。約60個の可能な並列スレッドがあるので( この記事を読んだ後でTPLのThreadPool制限を設定しているので)、プロセスが毎秒高いクエリを実行する可能性があります。 mdbファイルはネットワークドライブにあります。次のコードを使用して、各クエリで接続を作成して処理します。

Using connection As New OleDb.OleDbConnection(connectionString)
    result = connection.Query(Of Foo)(query, New With {.Param1 = param1, .Param2 = param2}).FirstOrDefault()
End Using

一見無作為に、時々、 connection.Queryの呼び出しSystem.AccessViolationException in System.Data.dllSystem.AccessViolationException in System.Data.dllconnection.Query 。この例外はアンマネージコードによってスローされるはずですが、アンマネージコードは直接使用しないため、 Query呼び出し後に発生します。また、マルチスレッドに関連する問題ではないことを確認したいと思っていましたが、ドキュメントを正しく理解していれば、クエリごとに1つのIDbConnection使用するとスレッドセーフでなければならず、Dapperもスレッドセーフであるはずです。

このエラーは、同じクエリやPOCOタイプでは必ずしも発生するとは限りません。ハードウェアの問題ではないでしょう(CPU <50%、メモリ<75%、プロセスは250 MB以上を消費しません)。 SQL ServerへのSqlConnection上の同様のコードに関する問題はまだ見ていません。

さらに、私はVS Express 2012で作業していますので、「例外でブレーク」を設定しても、例外アシスタントを使用してトラブルシューティングを行うことはできません。メモリ関連の例外であるため(私はOutOfMemoryExceptionをキャッチしたくないため)、スタックの上に例外をキャッチしたくないことは明らかです。

私は何か間違っているのですか?これは時々だけ発生するので、これをデバッグする方法はありますか?これはDapperやOleDbエンジンのバグでしょうか?

受け入れられた回答

私は、この問題が複数のスレッドがAccess DBに衝突していると思われます。私が知っている限り、 MS Access multi-threadedアプリケーション用に設計されていません 。これは並行処理に制限があるためです。

そこには多くのドキュメントがありませんが、MS Accessは高いストレスと高い並行性のために設計されていないことをhereで言及していhere

編集 :コメントに基づいて

  1. ステージングプロセスとしてアクセスデータベースをSQL Serverに直接ダンプし、ステージングテーブルのデータに対して.Netコードを実行してSQLの最終テーブルに入れることができます。
  2. SSIS data flow to manipulate the data使用SSIS data flow to manipulate the data 。おそらく.Netコードのスクリプトタスクを使用します
  3. Reactive Extensionsがデータをストリーミングするためにバッファを使用して、大容量の2GBのCSVファイルで使用されているプロセスを見てきました。したがって、msアクセスデータをCSVにダンプすることができれば、メモリ内で同様のプロセスを実行できます。


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ