2015-01-28 2 views
1

У меня есть сайт веб-форм, который использует NHibernate для подключения к базе данных MSSQL.Производительность и масштабируемость NHibernate

Я использую следующий класс для создания SessionFactory и получить текущую сессию использовать:

internal static class SessionManager 
{ 
    static readonly Configuration Configuration = new Configuration().Configure(); 
    internal readonly static ISessionFactory SessionFactory = Configuration.BuildSessionFactory(); 

    internal static ISession CurrentSession { get { if (!CurrentSessionContext.HasBind(SessionFactory))CurrentSessionContext.Bind(SessionFactory.OpenSession()); return SessionFactory.GetCurrentSession(); } } 
} 

И это пример того, как я использую предыдущий:

public abstract class Repository<TEntity> 
{ 

    protected internal ISession Session { get { return SessionManager.CurrentSession; } } 

    public IQueryable<TEntity> AllItems { get { return Session.Query<TEntity>(); } } 

} 

все работает отлично, хотя я считаю, что делаю что-то очень плохое с точки зрения производительности и масштабируемости, но я не вижу, что.

Может ли кто-нибудь указать мне, что есть и/или предложить лучший способ справиться с этим?

Заранее благодарен!

+0

Есть другие способы, чтобы организовать ее, что я считаю лучше (личные предпочтения). Но нет ничего плохого в вашем решении с точки зрения производительности. – Andre

ответ

1

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

Что вы можете сделать, это создать еще один статический метод, позволяющий закрыть сеанс, но вам нужно будет контролировать, когда его закрыть (в веб-среде он может быть в конце каждого запроса), или вы может использовать некоторую инфраструктуру инъекции зависимостей, например NInject или Замок Windsor для управления временем жизни объекта Session.

Взгляните на это:
(Yet another) nHibernate sessionmanager for ASP.NET (MVC)
Effective NHibernate Session management for web apps

Смежные вопросы