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

Posted

技术标签:

【中文标题】SQL Server CE 4.0 和频繁损坏的内存崩溃【英文标题】:SQL Server CE 4.0 and frequent corrupted memory crash 【发布时间】:2013-09-02 23:48:44 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

SqlCeConnection 和相关对象不能跨线程共享,这可能就是你面临的问题。每个线程创建一个新对象。

【讨论】:

我已经在这样做了。我想出了一个解决方案,或者更多的解决方法,因为我不知道为什么它可以解决问题,在我现在添加的答案中。【参考方案2】:

经过大量实验,我发现将数据库调用包装在事务中解决了这个问题。所以不是像这样的原始代码......

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;
    

【讨论】:

以上是关于SQL Server CE 4.0 和频繁损坏的内存崩溃的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 SQL Server CE 4.0

在 WPF 应用程序中未安装 SQL Server CE 4.0 的用法

SQL Server CE 数据库升级 3.5 到 4.0 C#

使用 SQL Server CE 4.0 的简单实体查询慢

将 SQL Server CE 数据库 (.sdf) 从 3.5 更新到 4.0

SQL Server CE 4.0 本地缓存代理?!英孚支持?