Я новичок в 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 выдает случайные ошибки, которые, я думаю, связаны с транзакциями.
Пожалуйста, совет.