マルチスレッド アプリケーションで Sql Server Compact Edition 3.5.1.0 SP1 を実行しています。アプリケーションは、トランザクションで挿入クエリをランダムに実行します。短いトランザクションでは、問題なく動作します。しかし、トランザクションが長くなり、実行間の遅延が短くなるか、アプリケーションをデバッグ モードで実行すると、SqlCE は次の例外をランダムにスローし始めます。
AccessViolationException 保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。
System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() で System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand (CommandBehavior 動作、文字列メソッド、ResultSetOptions オプション) で System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery() で SqlCompactTest.TransactedCommandGroupExecutionTest.Test () D:\Projects\PlayGround\SqlCompactTest\SqlCompactTest\TransactedCommandGroupExecutionTest.cs: 53 行目 D:\Projects\PlayGround\SqlCompactTest\SqlCompactTest\ExecutionTest.cs: 60 行目 SqlCompactTest.ExecutionTest の SqlCompactTest.ExecutionTest.RunTest() .TimerElapsed(Object sender, ElapsedEventArgs e) in D:\Projects\PlayGround\SqlCompactTest\SqlCompactTest\ExecutionTest.cs:System.Timers.Timer.MyTimerCallback(Object state) の 68 行目
私が実行しているコードは次のとおりです。
IDbConnection connection = m_connectionProvider.GetConnection(); // Just returns new connection
connection.Open();
IDbTransaction transaction = connection.BeginTransaction();
foreach (IDbCommand command in m_commands)
{
command.Connection = connection;
command.ExecuteNonQuery(); // This line throws exception
Thread.Sleep((int)m_delayBetweenExecutions);
}
transaction.Commit();
connection.Close();
このコードは、2 つのスレッドで同時に実行されます。接続文字列は次のとおりです。
"Data Source=testDB.sdf;Encrypt Database=True;Password=test;File Mode=Read Write;Persist Security Info=False;Max Database Size=1024"
フレームワーク 1.1 に戻したり、メソッド引数の順序を変更したり、最適化を有効/無効にしたりするなど、インターネットでばかげた解決策を見つけましたが、どれもうまくいきませんでした。また、マイクロソフトのサイトで可能な解決策を繰り返しましたが、自分に合った解決策を見つけることができませんでした. データベース ファイルのバージョンは 3.5.0.0 です。
どうすればこれを解決できますか?