Параллельный доступ к ESENT PersistentDictionary
Я использую управляемый класс ESENT PersistentDictionary, чтобы мое приложение C# сохраняло данные на сетевом ресурсе. Все это прекрасно работает, с одной оговоркой. Когда я пытаюсь получить доступ к базе данных с нескольких клиентских компьютеров (на всех запущено мое приложение), я иногда получаю исключение с сообщением "Системный путь уже используется другим экземпляром базы данных".
Из документации я понял, что ESENT поддерживает параллелизм, так что это не должно быть проблемой. Что я делаю неправильно?
Спасибо.
1 ответ
Есть небольшое недоразумение. ESENT поддерживает многопоточный параллелизм, но не многопроцессный параллелизм. esent.dll
открывает файл исключительно, поэтому любой другой процесс получит ACCESS_DENIED
(за исключением режима только для чтения - несколько процессов могут открывать базу данных в режиме только для чтения).
Кроме того, блокировка файлов через SMB не такая жесткая, как при доступе к локальной файловой системе, и поведение кэширования также отличается. Не рекомендуется иметь базу данных на удаленном общем ресурсе SMB, хотя у вас, вероятно, не будет проблем с ней в реальной жизни. (И некоторые из этих рекомендаций были основаны на более старых версиях SMB. Более новые версии могли бы изменить детали реализации настолько, чтобы они отлично работали - наверное, я просто недостаточно знаю:)
Чтобы иметь доступ с нескольких компьютеров, вам нужно написать собственный серверный процесс для обработки запросов с других компьютеров. Сожалею.
-Мартин