SQL Server CE CoTaskMemFree исключение - PullRequest
3 голосов
/ 07 декабря 2011

Я не смог найти никого другого на SO, у которого была такая же проблема, и Google не сильно помог. Может быть хорошим для некоторых из вас волшебников там.

Мы разработали сервис, который получает данные в режиме реального времени со сторонних устройств. Мы берем эти данные и затем вставляем их в API нашего веб-сервиса. Мы приняли SQL Server CE в качестве временной базы данных, чтобы хранить необработанные данные только в течение очень короткого периода времени от перехода от сети к нашему API (на случай, если наш API не работает или недоступен, у нас есть способ восстановить, если служба перезапускается, поэтому мы ничего не теряем в ожидании). Наше приложение иногда дает сбой во время различных операций при использовании соединения SQL Server CE 3.5 SP2 Linq.

Эта ошибка возникает, возможно, один или два раза в день, однако создает для нас проблему, поскольку мы не хотим потерять какие-либо данные при перезапуске службы. Каждый день наш сервис записывает 10–1 млн записей в базу данных SQL Server CE, а время жизни записей обычно составляет 10–50 миллисекунд, если наш API не задерживается / не работает.

Эта ошибка возникает в следующих случаях: Windows 7 x64, Windows 2008 x64 - единственные ОС, которые мы запускаем. Много разных серверов Dell, виртуальных серверов (VMWare / VirtualBox). Я не думаю, что это связано с аппаратным обеспечением или ОС. На всех запущен SQL Server CE SP2.

Изначально у меня были все вызовы, создающие новые экземпляры DataContext, выполняющие свою работу и избавляющиеся от объекта. Кажется, это работает нормально, без утечек памяти или проблем с процессором.

using (var dataContext = new PendingItemsDataContext(_databasePath))
{
    // Do something.
}

Видя, что проблема была внутренней по отношению к коду MS, был сделан какой-то вызов dispose, я решил создать экземпляр уровня DataContext на уровне класса и выполнить все операции с ним.

Поскольку приложение является многопоточным, я столкнулся с некоторыми проблемами с такими элементами, как состояние DataContext в настоящее время выполняет другую операцию, поэтому я получил исключения. Нет проблем, я сделаю некоторую блокировку.

Затем я обернул все операции DataContext блокировкой, которая разрешила проблему. Я подтвердил, что одновременно может выполняться только одна операция, даже если несколько потоков читают и записывают в эту временную базу данных.

 lock (_tempDbRWLock)
 {
      _dataContext.PendingItems.InsertAllOnSubmit(list);
      _dataContext.SubmitChanges();
 }

Однако я все еще борюсь с той же ошибкой, которую я изначально пытался исправить.

SqlCe CoTaskMemfree Exception

Framework Framework: v4.0.30319
Описание: процесс был прерван из-за необработанного исключения.
Информация об исключении: System.AccessViolationException
Стек:
в System.Data.SqlServerCe.NativeMethods.CoTaskMemFree (IntPtr)
в System.Data.SqlServerCe.Accessor.Dispose ()
в System.Data.SqlServerCe.SqlCeCommand.CloseInternalCommand ()
в System.Data.SqlServerCe.SqlCeCommand.set_Transaction (System.Data.SqlServerCe.SqlCeTransaction)
в System.Data.SqlServerCe.SqlCeConnection + ObjectLifeTimeTracker.Zombie (System.Data.SqlServerCe.SqlCeTransaction)
в System.Data.SqlServerCe.SqlCeConnection.Zombie (System.Data.SqlServerCe.SqlCeTransaction)
в System.Data.SqlServerCe.SqlCeTransaction.Commit (System.Data.SqlServerCe.CommitMode)
в System.Data.SqlServerCe.SqlCeTransaction.Commit ()
в System.Data.Linq.DataContext.SubmitChanges (System.Data.Linq.ConflictMode)
в System.Data.Linq.DataContext.SubmitChanges ()
в HJT.DataEventsLibrary.Controllers.PosMessageController.SubmitToPendingItemsDB ()
в HJT.DataEventsLibrary.Controllers.PosMessageController.b__a ()
в System.Threading.ThreadHelper.ThreadStart_Context (System.Object)
в System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
в System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
в System.Threading.ThreadHelper.ThreadStart ()

Есть рекомендации?Я был очень соблазн, чтобы сбросить SQL Server CE.Google не дает много результатов для этой проблемы.Те, которые всплывают, не относятся к этому приложению.

Я уже начал оценивать Sqlite и некоторые другие системы БД с одним экземпляром.Просто сложно превзойти простоту SQL Server CE.Мне нужна легкая альтернатива или решение этой проблемы.

Заранее спасибо.

...