nhibernate сеанс фактического экземпляра более одного раза на веб-сервисе - PullRequest
0 голосов
/ 14 января 2011

У меня есть веб-сервис, который использует nhibernate.У меня есть одноэлементный шаблон в библиотеке репозитория, но при каждом вызове службы он создает новый экземпляр фабрики сеансов, что очень дорого.Что я могу сделать?

    #region Atributos

    /// <summary>
    /// Session
    /// </summary>
    private ISession miSession;

    /// <summary>
    /// Session Factory
    /// </summary>
    private ISessionFactory miSessionFactory;
    private Configuration miConfiguration = new Configuration();
    private static readonly ILog log = LogManager.GetLogger(typeof(NHibernatePersistencia).Name);

    private static IRepositorio Repositorio;

    #endregion

    #region Constructor

    private NHibernatePersistencia()
    {
        //miConfiguration.Configure("hibernate.cfg.xml");
        try
        {
            miConfiguration.Configure();
            this.miSessionFactory = miConfiguration.BuildSessionFactory();
            this.miSession = this.SessionFactory.OpenSession();
            log.Debug("Se carga NHibernate");

        }
        catch (Exception ex)
        {
            log.Error("No se pudo cargar Nhibernate " + ex.Message);
            throw ex;
        }

    }

    public static IRepositorio Instancia
    {
        get
        {
            if (Repositorio == null)
            {
                Repositorio = new NHibernatePersistencia();
            }
            return Repositorio;
        }
    }

    #endregion

    #region Propiedades

    /// <summary>
    /// Sesion de NHibernate
    /// </summary>
    public ISession Session
    {
        get { return miSession.SessionFactory.GetCurrentSession(); }
    }

    /// <summary>
    /// Sesion de NHibernate
    /// </summary>
    public ISessionFactory SessionFactory
    {
        get { return this.miSessionFactory; }
    }

    #endregion

Каким образом я могу создать один экземпляр для всех служб?

1 Ответ

1 голос
/ 15 января 2011

я думаю, что вы уже упомянули решение. Вы должны использовать Singleton для Sessionfactory-Provider. Лично я предпочитаю использовать Spring для управления моим ApplicationContext, связывая мои объекты, но это не обязательно. Просто не используйте NHibernatePersistencia-Object в качестве службы, а в качестве SessionProvider, и все в порядке.

Ваш сервис может выглядеть так:

public class YourService : IYourService
{
    public User GetUsers(int id)
    {
        using(NHibernatePersistencia.OpenSession())
        {
            return session.Load(typeof(user), id);
        }
    }      
}

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

public class NHibernatePersistencia
{
    /* ...  */
    public ISession OpenSession()
    {
        return this.SessionFactory.OpenSession();
    }
    /* ...  */
}

Это просто, но должно работать. Может быть, вы хотите взглянуть на этот пример nhibernate.info . NHibernateHelper там во многом похож на ваш NHibernatePersistencia-Class.

...