SQL Server CE 4.0和频繁损坏的内存崩溃
本文关键字:损坏 内存 崩溃 Server CE SQL | 更新日期: 2023-09-27 18:29:54
我有一个WPF应用程序,它使用SQL Server Compact Edition 4.0在本地计算机上存储数据。我遇到了来自Compact Edition 4.0数据库的随机但相当频繁的崩溃。它总是给出相同的错误。。。。
Attempted to read or write protected memory. This is often an indication that other
memory is corrupt.
使用以下有限堆栈跟踪。。。
at System.Data.SqlServerCe.NativeMethodsHelper.SafeRelease(IntPtr& ppUnknown)
at System.Data.SqlServerCe.SqlCeCommand.ReleaseNativeInterfaces()
at System.Data.SqlServerCe.SqlCeCommand.Dispose(Boolean disposing)
at System.Data.SqlServerCe.SqlCeCommand.Finalize()
我有一个单独的线程,用于所有CE数据库调用,所以我知道我所有的数据库调用都是序列化的(没有对数据库的并发调用),并且它们都发生在同一个线程上。当异常发生时,它总是具有上面的详细信息。
它是不可复制的,但它经常发生,以至于我的应用程序在运行10分钟以上都无法存活。有时它会在运行的最初几秒钟内崩溃,有时甚至长达10分钟,但很可能介于两个极端之间。
我在谷歌上找不到任何有用的东西,所以希望这是其他人可能已经看到的问题,并有解决办法。谢谢
SqlCeConnection和相关对象不能在线程之间共享,这可能就是您所面临的问题。为每个线程创建一个新对象。
经过大量实验,我发现将数据库调用封装在事务中解决了这个问题。所以不是像这样的原始代码。。。
using (AMSDBContext context = CreateDatabaseContext())
{
// actual operation code called here...
context.SaveChanges();
}
我现在做以下操作,从那以后它就没有崩溃过。。。
using (AMSDBContext context = CreateDatabaseContext())
{
if (context.Connection.State != System.Data.ConnectionState.Open)
context.Connection.Open();
EntityConnection entityConnection = (EntityConnection)context.Connection;
using (EntityTransaction tx = entityConnection.BeginTransaction())
{
// actual operation code called here...
context.SaveChanges();
tx.Commit();
return ret;
}
}