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分钟,但很可能介于两个极端之间。

我在谷歌上找不到任何有用的东西,所以希望这是其他人可能已经看到的问题,并有解决办法。谢谢

SQL Server CE 4.0和频繁损坏的内存崩溃

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;
    }
}
相关文章: