2011-01-14 8 views
0

私はnhibernateを使用するWebサービスを持っています。リポジトリライブラリにシングルトンパターンがありますが、サービスを呼び出すたびに非常に高価なセッションファクトリの新しいインスタンスが作成されます。私に何ができる?Webサービスでnhibernate sessionfactoryインスタンスが複数回

#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つのインスタンスを作成できますか?

+0

提案:「throw ex;」は使用しないでください。あなたは "スロー"したい。それ以外の場合は、スタックトレースは例外が "throw ex;"の場所から来たように見えます。 –

答えて

1

私はあなたがすでに解決策を述べたと思います。 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用:

あなたのサービスは、次のようになります。長期セッションは遅く成長しています。 Webサービスの複数のユーザーを考えると、これは良い考えではないようです。

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

これは簡単ですが動作するはずです。多分このnhibernate.info exampleを見てみたいです。 NHibernateHelperはあなたのNHibernatePersistenciaクラスにかなり似ています。

関連する問題