реализация менеджера сессий nhibernate - PullRequest
0 голосов
/ 09 февраля 2012

Я новичок в Nhibernate и замедляю свою работу, изучая его. Я попытался реализовать класс диспетчера сеансов, чтобы помочь мне получить сеанс для моих вызовов БД. Ниже приведен код для этого. Может кто-нибудь сказать, если это архитектурно правильно, и предвидеть какие-либо проблемы с масштабируемостью или производительностью?

public static class StaticSessionManager
{
    private static ISession _session;

    public static ISession GetCurrentSession()
    {
        if (_session == null)
            OpenSession();

        return _session;
    }

    private static void OpenSession()
    {
        _session = (new Configuration()).Configure().BuildSessionFactory().OpenSession();
    }
    public static void CloseSession()
    {
        if (_session != null)
        {
            _session.Close();
            _session = null;
        }
    }
}

и в своем классе провайдера данных я использую следующий код для получения данных.

    public class GenericDataProvider<T>
    {
            NHibernate.ISession _session;

            public GenericDataProvider()
            {
                this._session = StaticSessionManager.GetCurrentSession();
            }

            public T GetById(object id)
            {
                using (ITransaction tx = _session.BeginTransaction())
                {
                    try
                    {
                        T obj = _session.Get<T>(id);
                        tx.Commit();
                        return obj;
                    }
                    catch (Exception ex)
                    {
                        tx.Rollback();
                        StaticSessionManager.CloseSession();
                        throw ex;
                    }
                }
            }
    }

, а затем

public class UserDataProvider : GenericDataProvider<User>
{
    public User GetUserById(Guid uid)
    {
        return GetById(uid)

    }
}

Окончательное использование на странице

UserDataProvider  udp = new UserDataProvider();
User u = udp.GetUserById(xxxxxx-xxx-xxx);

Это то, что правильно? Приведет ли создание множества поставщиков данных на одной странице к проблемам?

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

Пожалуйста, совет.

1 Ответ

2 голосов
/ 09 февраля 2012

Из того, что я вижу, вы строите фабрику сессий, если у вас есть null сессия. Вы должны звонить BuildSessionFactory() только один раз при запуске приложения.

Если вы делаете это, это зависит от вас, некоторые люди создают SessionFactory внутри Global.asax в методе application_start или в вашем случае имеют статическое свойство sessionFactory вместо session в вашем StaticSessionManager класс.

Я подозреваю, что ваши ошибки связаны с тем, что ваша фабрика сессий строится несколько раз!

Другой момент заключается в том, что некоторые люди открывают транзакцию _session.BeginTransaction() в начале каждого запроса и commit или rollback в конце каждого запроса. Это дает вам единицу работы, что означает, что вы можете потерять

using (ITransaction tx = _session.BeginTransaction())  
{
 ...
}

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

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