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

时间:2013-09-02 23:48:44

标签: c# wpf multithreading sql-server-ce

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

我找不到谷歌搜索中有用的东西,所以希望这是其他人可能已经看到的问题,并有一个解决方法。感谢。

2 个答案:

答案 0 :(得分:3)

无法跨线程共享SqlConnection和相关对象,这可能就是您所面临的问题。为每个线程创建一个新对象。

答案 1 :(得分: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;
    }
}