科技行者

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

知识库

知识库 安全导航

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

NHibernate中Session的处理

  • 扫一扫
    分享文章到微信

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

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

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

关键字: session NHibernate 编程

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

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

  

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


 

查看本文来源

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

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章