NHibernate + одновременные правки: как получать уведомления об изменениях? - PullRequest
6 голосов
/ 12 ноября 2010

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

I'm не ищет версионность, то есть согласованность перед лицом одновременных правок - я знаю, что NHibernate поддерживает оптимистический / пессимистичный параллелизм, и в настоящее время я использую оптимистический параллелизм через StateStateException.

Я простохочу знать: учитывая, что пользователь A изменяет строку в наборе данных, как дать пользователю B знать, что произошло изменение, чтобы набор данных мог быть перезагружен?Сейчас я лениво загружаю большой список клиентов в сетку с помощью NHibernate.Теперь, если будет добавлен новый клиент, я бы хотел добавить его в таблицу, не перезагружая все данные снова - первое беспокойство приложения - производительность.

Кроме того, будет ли NHibernate изящно обрабатывать изменения в существующих строках?Будет ли он каким-то образом обнаруживать изменения в базовой базе данных и обновлять объекты .NET в памяти, чтобы при доступе к их свойствам получались обновленные значения?

Я думал об использовании дополнительной таблицы, сохраняя идентификаторы обновленных объектов вместе с ними.с отметкой времени, чтобы обновить предметы самостоятельно, но если NHinbernate предлагает что-то свое, это был бы гораздо лучший выбор, очевидно ...

Ответы [ 2 ]

3 голосов
/ 12 ноября 2010

Для этого вам нужны уведомления / события на уровне базы данных. То есть ядро ​​базы данных должно предоставлять уведомления. Например, SQL Server имеет эту функцию . NHibernate запускается в приложении, поэтому все, что он может потенциально делать сам по себе , опрашивает базу данных на предмет изменений (ваша идея использовать дополнительную таблицу выглядит как опрос), и мы все знаем, что это нехорошо. SysCache2 от NHibernate использует преимущества SqlCacheDependencies для аннулирования записей кэша, когда база данных генерирует уведомление, но я не знаю, что оно может вызывать любые события, которые будут использоваться самим приложением (что в любом случае не было бы полезно , поскольку кэши 2-го уровня не работают с целыми объектами).

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

0 голосов
/ 13 ноября 2010

Мне пришлось решить некоторые похожие проблемы в моем текущем проекте SQLite Fluent NHibernate.

Для обнаружения обновлений базы данных я использовал System.IO.FileSystemWatcher .См. Пример кода в моем ответе на мой аналогичный вопрос .Кроме того, взгляните на другой ответ на тот же вопрос, который предложил использовать NHibernate Interceptors .

Я также лениво загружаю свою БД в сетку.Всякий раз, когда FileSystemWatcher обнаруживает, что БД была обновлена, я вызываю следующий Критерий запроса и добавляю новые записи, которые он возвращает, в BindingList, который является источником данных для моей сетки.(Я просто сохраняю самый высокий идентификатор новых записей в закрытой переменной)

    /// <summary>
    /// Return list of measurements with Id fields higher than id parameter
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public static IList<T> GetMeasurementsNewerThan(int id)
    {
        var session = GetMainSession();

        using (var transaction = session.BeginTransaction())
        {
            var newestMeasurements =
                session.CreateCriteria(typeof(T))
                       .Add(Expression.Gt("Id", id))
                       .List<T>();

            transaction.Commit();

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