Параллельный доступ к ESENT PersistentDictionary

Я использую управляемый класс ESENT PersistentDictionary, чтобы мое приложение C# сохраняло данные на сетевом ресурсе. Все это прекрасно работает, с одной оговоркой. Когда я пытаюсь получить доступ к базе данных с нескольких клиентских компьютеров (на всех запущено мое приложение), я иногда получаю исключение с сообщением "Системный путь уже используется другим экземпляром базы данных".

Из документации я понял, что ESENT поддерживает параллелизм, так что это не должно быть проблемой. Что я делаю неправильно?

Спасибо.

1 ответ

Решение

Есть небольшое недоразумение. ESENT поддерживает многопоточный параллелизм, но не многопроцессный параллелизм. esent.dll открывает файл исключительно, поэтому любой другой процесс получит ACCESS_DENIED (за исключением режима только для чтения - несколько процессов могут открывать базу данных в режиме только для чтения).

Кроме того, блокировка файлов через SMB не такая жесткая, как при доступе к локальной файловой системе, и поведение кэширования также отличается. Не рекомендуется иметь базу данных на удаленном общем ресурсе SMB, хотя у вас, вероятно, не будет проблем с ней в реальной жизни. (И некоторые из этих рекомендаций были основаны на более старых версиях SMB. Более новые версии могли бы изменить детали реализации настолько, чтобы они отлично работали - наверное, я просто недостаточно знаю:)

Чтобы иметь доступ с нескольких компьютеров, вам нужно написать собственный серверный процесс для обработки запросов с других компьютеров. Сожалею.

-Мартин

Другие вопросы по тегам