[Разделение запроса и решения]
Вот как мы решили проблему:
A) Закрытие / удаление объектов Connection / Command / Transaction: мы убедились, что неиспользуемые, незакрытые объекты связи, транзакции или команды.Наш инструмент ORM создавал новые объекты после вызова commit для транзакции, которая в некоторых случаях простаивала.Это в значительной степени уменьшило количество искажений на 50%.
B) Отключение автосжатия: единственной процедурой, происходящей в середине выполнения приложения, над которой мы не имели никакого контроля, была автосжатие.Мы вызывали SqlCeEngine.Compact при запуске приложения.Мы решили покончить как с уплотнением, так и с автоусадкой.И, к нашему удивлению, мы сократили коррупцию еще на 48%.Это был выстрел в темноте, и мы не могли поверить, что автоматическое сжатие могло вызвать такие проблемы.Мы практически решили проблему с этим обновлением.
C) Синхронизированные транзакции базы данных: некоторые повреждения базы данных все еще происходят.Без четких причин мы решили синхронизировать транзакции базы данных!Я знаю, что многим людям из баз данных это не понравится.Мне это тоже не нравится.Мы ввели блокировки на нашем среднем уровне, чтобы гарантировать, что только один вызов изменяет базу данных одновременно.Наша самая большая реализация - 55 клиентов, одновременно использующих нашу систему.Синхронизация вызовов базы данных едва ли приводила к какой-либо видимой задержке производительности.Скорее Синхронизация позволила нам реализовать управляемый таймером вызов SqlCeEngine.Compact через регулярные промежутки времени.Мы знали, что Compact не был виновником, и мы чувствовали, что Compaction - необходимый вызов, поскольку он переиндексирует базу данных (наше решение выполняет много операций вставки и удаления).Тем не менее, он должен функционировать исключительно;нет звонков из базы данных при вызове Compact.Синхронизация позволила нам контролировать это во время запуска приложения.С тех пор как мы это сделали, мы не получили ни одной проблемы с повреждением базы данных.Прошло уже больше месяца.От почти 5 клиентов в неделю до нуля в месяц.
Основная идея, которая привела нас к идеям B и C, заключается в том, что SQLCE является встроенной базой данных.Повреждения являются общими для каждого решения встраиваемой базы данных.Полноценные решения для баз данных работают независимо, поддерживаются круглосуточным db-сервером, управляющим соединениями и другими задачами.Встроенная система баз данных не имеет такой системы поддержки.Единственный этап, когда он жив, - это когда соединение открыто.
Еще несколько указателей: 1) Мы реализуем commit с CommitMode.Immediate, что делает свойство Flush-Interval избыточным.2) AutoShrink установлен на 100, что полностью отключает процедуру. 3) Я увеличил тайм-аут соединения, чтобы синхронизированные вызовы базы данных функционировали плавно.4) Компакт вызывается при запуске приложения.В тех случаях, когда клиенты вообще не выключают свою машину, мы включили таймер для вызова Compact каждые 24 часа.
Надеюсь, этот пост поможет решить проблемы.