我在多线程应用程序中运行Sql Server Compact Edition 3.5.1.0 SP1。应用程序在事务中随机运行插入查询。随着短交易,它工作正常。但是当事务变得更长并且执行之间的延迟变得更短或者我在调试模式下运行应用程序时,SqlCE开始随机抛出以下异常:
AccessViolationException尝试 读或写受保护的内存。这个 通常表明其他 记忆已腐败。
在 System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() 在 System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(的CommandBehavior 行为,String方法, ResultSetOptions选项)at System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery() 在 SqlCompactTest.TransactedCommandGroupExecutionTest.Test() 在 d:\项目\操场\ SqlCompactTest \ SqlCompactTest \ TransactedCommandGroupExecutionTest.cs:行 53点 SqlCompactTest.ExecutionTest.RunTest() 在 d:\项目\操场\ SqlCompactTest \ SqlCompactTest \ ExecutionTest.cs:行 60点到 SqlCompactTest.ExecutionTest.TimerElapsed(对象 发件人,ElapsedEventArgs e)in d:\项目\操场\ SqlCompactTest \ SqlCompactTest \ ExecutionTest.cs:行 68点 System.Timers.Timer.MyTimerCallback(对象 状态)
我正在运行的代码是:
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();
此代码在两个线程中同时运行。连接字符串是:
"Data Source=testDB.sdf;Encrypt Database=True;Password=test;File Mode=Read Write;Persist Security Info=False;Max Database Size=1024"
我在互联网上找到了荒谬的解决方案,例如恢复到框架1.1,更改方法参数的顺序,启用/禁用优化等等,但它们都不适用于我。我也迭代了possible solutions on microsoft sites,但我找不到适合我的解决方案。我的数据库文件版本是3.5.0.0。
我该如何解决这个问题?
答案 0 :(得分:6)
仅仅因为您设置了与command.Connection的连接并不意味着它已设置。
command.Connection = connection;
command.Connection.GetHashCode() == connection.GetHashCode(); // may return false.
这是问题的原因。可以使用connection.CreateCommand();
进行更正答案 1 :(得分:4)
SQL CE objects are not thread-safe。此外,同一篇文章列出了版本不匹配的情况(在我的情况下发生)。