科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道NHibernate中Session的处理

NHibernate中Session的处理

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

   NHibernate中Session是线程不安全的,而且每次数据库操作 请求创建Session时对性能有些影响。在Windows应用中可以通过 [ThreadStatic]特性很简单的就可以实现线程安全。

作者:中国IT实验室 来源:中国IT实验室 2007年10月2日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

  

 

 

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();
        }

    }

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件