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

4

我有一个使用SQL Server Compact Edition 4.0在本地存储数据的WPF应用程序。我经常会遇到来自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分钟内发生,但最可能的情况是在两个极端之间的某个地方。

我无法从谷歌搜索中找到任何有用的信息,希望其他人曾经遇到过这个问题并且有解决方法。谢谢。

2个回答

3

SqlCeConnection及其相关对象不能在多个线程之间共享,这可能是您所面临的问题。每个线程创建一个新对象。


我已经在做这件事了。我想出了一个解决方案,或者更多的是一种变通方法,因为我不知道它为什么能解决问题,在我现在添加的答案中。 - Phil Wright

1
经过多次尝试,我发现将数据库调用包装在事务中可以解决这个问题。因此,原始代码改为以下形式...
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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接