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