Свободный NHibernate - нужен многопрограммный доступ к одной загруженной базе данных SQLite - PullRequest
1 голос
/ 19 декабря 2009

Я занимаюсь разработкой проекта, в котором есть несколько программ, использующих один и тот же лениво загруженный файл базы данных SQLite, использующий Fluent Nhibernate (Auto Mapping) в качестве слоя доступа к данным.

Первая программа, которую я разработал (назовем ее Программой 1), постоянно поддерживала сессию, и отложенная загрузка работала нормально.

Этот подход не удался, когда я запустил Программу 2 и попытался записать в базу данных из Программы 2 во время работы Программы 1 - я получил исключения «база данных заблокирована».

Я справился с этим, закрыв сессию после запуска программы 1 - например,

        private ISessionFactory _sessionFactory;
        private ISession _session;

        _sessionFactory = Database.CreateSessionFactory();

        _session = _sessionFactory.OpenSession(); 
        _session.BeginTransaction();

        // ... read the database here

        _session.Close();

Конечно, это прервало ленивую загрузку в Программе 1, когда пользователь выбрал другой набор данных из интерфейса пользователя - что я и ожидал.

Я думал, что смогу просто снова открыть сессию, когда пользователь выберет новые данные, а затем снова закрыть ее, например,

        if ( !_session.IsOpen )
            _session = _sessionFactory.OpenSession();

        if ( !_session.IsConnected )
            _session.Reconnect();

        _session.BeginTransaction();

        // ... read the database here

        _session.Close();

Но до сих пор не удалось заставить это работать. Я получаю исключение "нет сеанса или сеанс был закрыт", когда я пытаюсь прочитать данные, хотя я только что открыл сеанс. (Тест на соединение был всего лишь экспериментом, потому что трассировка исключений говорила что-то о создании отложенных исключений при отключении, но это не помогало)

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 19 декабря 2009

Возможно ли вам создать сервисный уровень, который инициируется первым приложением, которое вызывает его (или регистрируется как служба Windows, если вы находитесь в окне Windows), а затем заставляете всех вызывать эту службу, чтобы получить свои данные от?

Я не говорю об отдельном сервере, просто об отдельном сервисе, в который ваши программы обращаются.

0 голосов
/ 15 июля 2011

Исключения «базы данных заблокированы» таинственным образом исчезли после того, как я по каким-то причинам изменил код кода управления сеансом. (Основные изменения заключались в том, чтобы использовать транзакции для доступа к ВСЕМ БД и обеспечить правильное удаление всех объектов Transaction и Session - в основном, заключая их в блоки «using»).

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

Еще один хороший источник того, что можно попробовать - Файл базы данных необъяснимым образом блокируется во время фиксации SQLite

В любом случае, несколько программ теперь успешно читают и записывают в одну общую базу данных SQLite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...