NHibernate中Session的處理

來源:互聯網
上載者:User
session

NHibernate中Session是線程不安全的,而且每次資料庫操作 請求建立Session時對效能有些影響。在Windows應用中可以通過 [ThreadStatic]特性很簡單的就可以實現安全執行緒,而在Web中可以通過將Session與用於請求HttpContext綁定實現安全執行緒,並且使用者當前請求時只有一個Session。代碼如下:

ISessionManage.cs

using System;
using NHibernate;

namespace Commercial.Jwsoft.Framework.Persistence.SessionManage
{
    /// <summary>
    /// 功能:主要用於封裝第三方類庫操作資料庫的Session類,現主要用於封裝NHibernate中的Session
    /// </summary>
    public interface ISessionManage
    {
        /// <summary>
        /// 擷取Session的一個執行個體
        /// </summary>
        /// <returns>返回實現NHibernate.ISession介面的類</returns>
        ISession Get();

        /// <summary>
        /// 設定Session的一個執行個體
        /// </summary>
        /// <param name="session">實現NHibernate.ISession介面的類</param>
        void Set(ISession session);
    }
}

--------------------------------------------

WebNHSession.cs

using System;
using System.Web;
using NHibernate;

namespace Commercial.Jwsoft.Framework.Persistence.SessionManage
{
    /// <summary>
    /// 功能:此類用於Web應用,NHibernate提供的Session有兩個缺陷:
    ///       一方面是線程不安全的,另一方面每次資料庫操作建立一個Session對程式效能有影響。
    ///       因此通過將Session綁定到HttpContext上,這樣每個使用者具有唯一的一個Session,而且
    ///       在使用者的請求結束後關閉Session並自己釋放掉。
    /// </summary>
    public class WebNHSession : ISessionManage
    {
        public WebNHSession()
        {

        }

        /// <summary>
        /// 擷取儲存到HttpContext中的實現NHibernate.ISession介面的類執行個體
        /// </summary>
        /// <returns>實現NHibernate.ISession介面的類執行個體,當使用者之前沒有調用Set方法會返回Null</returns>
        public ISession Get()
        {
            return (ISession)HttpContext.Current.Items[SessionConfigManage.SessionSourceItemName];
        }

        /// <summary>
        /// 儲存實現NHibernate.ISession介面的類執行個體到HttpContext中
        /// </summary>
        /// <param name="session">實現NHibernate.ISession介面的類執行個體</param>
        public void Set(ISession session)
        {
            if (session != null)
            {
                HttpContext.Current.Items.Add(SessionConfigManage.SessionSourceItemName, session);
            }
            else
            {
                HttpContext.Current.Items.Remove(SessionConfigManage.SessionSourceItemName);
            }
        }
    }
}
---------------------------------------------

WinFormNHSession.cs

using System;
using NHibernate;

namespace Commercial.Jwsoft.Framework.Persistence.SessionManage
{
    /// <summary>
    /// 功能:此類用於Windows應用,NHibernate提供的Session有兩個缺陷:
    ///       一方面是線程不安全的,另一方面每次資料庫操作建立一個Session對程式效能有影響。
    ///       因此通過線程變數擷取一個NHibernate Session的多個安全執行緒的執行個體,而且線程變數使用後即釋放掉。
    /// </summary>
    public class WinFormNHSession : ISessionManage
    {
        [ThreadStatic]
        private static ISession _threadSession = null;

        public WinFormNHSession()
        {
        }

        /// <summary>
        /// 擷取儲存到線程變數中的實現NHibernate.ISession介面的類執行個體
        /// </summary>
        /// <returns>實現NHibernate.ISession介面的安全執行緒的類執行個體,當使用者之前沒有調用Set方法會返回Null</returns>
        public ISession Get()
        {
            if (_threadSession != null)
            {
                if (_threadSession.IsConnected)
                {
                    _threadSession.Reconnect();
                }
            }
            return _threadSession;
        }

        /// <summary>
        /// 儲存實現NHibernate.ISession介面的類執行個體到線程變數中
        /// </summary>
        /// <param name="session">實現NHibernate.ISession介面的類執行個體</param>
        public void Set(ISession session)
        {
            if (_threadSession.IsConnected)
            {
                session.Disconnect();
            }
            _threadSession = session;
        }
    }
}


----------------------------------------------

SessionFactory.cs

using System;
using System.Runtime.Remoting;
using NHibernate;


namespace Commercial.Jwsoft.Framework.Persistence.SessionManage
{
    /// <summary>
    /// 功能:管理多個實現ISessionManage介面的類工廠,根據讀取的要載入的類名稱資訊,進行動態建立Session
    /// </summary>
    public class SessionFactory
    {
        private static ISession session = null;
        private static ISessionManage sessionManage = null;
       
        static SessionFactory()
        {
            Init();
        }

        /// <summary>
        /// 擷取實現NHibernate.ISession介面的Session執行個體
        /// </summary>
        /// <returns>返回實現NHibernate.ISession介面的類執行個體</returns>
        public static ISession GetSession()
        {
                      session = sessionManage.Get();
          
            if (session == null)
            {
                session = NHibernateSession.GetNHibernateSession();
                sessionManage.Set(session);
            }

            return session;
        }

        private static void Init()
        {
            System.Reflection.Assembly ass = System.Reflection.Assembly.Load(SessionConfigManage.AssemblyName);
            sessionManage = (ISessionManage)ass.CreateInstance(SessionConfigManage.SessionSourceItemName);
        }
    }
}
----------------------------------------------

NHibernateSession.cs

using System;
using System.Data;
using System.Collections.Generic;
using System.Text;
using NHibernate;
using NHibernate.Cfg;

namespace Commercial.Jwsoft.Framework.Persistence.SessionManage
{
    /// <summary>
    /// 功能:載入嵌入資源(Xml設定檔),開啟一個SessionFactory,擷取NHibernate的Session執行個體
    /// </summary>
    public class NHibernateSession
    {
        private static Configuration cfg = null;
        private static ISessionFactory sessionFactory = null;

        static NHibernateSession()
        {
            cfg = new Configuration().Configure();
            sessionFactory = cfg.BuildSessionFactory();
        }

        /// <summary>
        /// 擷取NHibernate的Session執行個體
        /// </summary>
        /// <returns></returns>
        public static ISession GetNHibernateSession()
        {
            return sessionFactory.OpenSession();
        }
    }
}
---------------------------------------------

SessionConfigManage.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;

namespace Commercial.Jwsoft.Framework.Persistence.SessionManage
{
    /// <summary>
    /// 功能:根據類庫的應用環境不同(Windows應用還是Web應用),動態建立類執行個體
    /// 日期:2006-08-24
    /// 作者:郭少宏
    /// </summary>
    public class SessionConfigManage
    {
        private const string SESSION_ITEM_NAME = "SessionItemName";
        private static object _locker = new object();
        private static string _sessionItemName = string.Empty;
        private static string _assemblyName = string.Empty;

        static SessionConfigManage()
        {
            string configString = ConfigurationManager.AppSettings[SESSION_ITEM_NAME];
            string[] arr = configString.Split(',');
            _sessionItemName = arr[0];
            _assemblyName = arr[1];
        }
        /// <summary>
        /// 擷取設定檔中名為SESSION_ITEM_NAME配置節的資訊,記錄的要載入的SessionManage的類全稱
        /// </summary>
        /// <returns>實現ISessionManage介面的類的名稱</returns>
        public static string SessionSourceItemName
        {
            get
            {
                lock (_locker)
                {
                    return _sessionItemName;
                }
            }
        }

        /// <summary>
        /// 擷取設定檔中名為SESSION_ITEM_NAME配置節的資訊,記錄的要載入的SessionManage的類全稱
        /// </summary>
        /// <returns>實現ISessionManage介面的類的程式集名稱</returns>
        public static string AssemblyName
        {
            get
            {
                lock (_locker)
                {
                    return _assemblyName;
                }
            }
        }
    }
}

在Web.Config檔案中的配置節如下:

<appSettings>
    <!---->
    <!--在Web應用中載入的擷取Session的類名稱-->
    <add key="SessionItemName" value="Commercial.Jwsoft.Framework.Persistence.SessionManage.WebNHSession,JWFramework"/>
    <!--在Windows應用中載入的擷取Session的類名稱-->
    <!--<add key="SessionItemName" value="Commercial.Jwsoft.Framework.Persistence.SessionManage.WinFormNHSession,JWFramework"/>-->
  </appSettings>

在Global.asax中添加如下代碼:

 /// <summary>
    /// 當使用者斷開請求時用來關閉使用者請求的Session的串連
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
  void Session_End(object sender, EventArgs e)
    {
        NHibernate.ISession session = Commercial.Jwsoft.Framework.Persistence.SessionManage.SessionFactory.GetSession();
        if (session != null)
        {
            session.Close();
        }

    }



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。