Nhibernate的Session管理

参考:http://www.cnblogs.com/renrenqq/archive/2006/08/04/467688.html

但这个方法还不能解决Session缓存问题,由于创建Session需要消耗大量的内存,参考上面的方法,当请求并发的时候,内存不断的增加。

在网上找了很多种方法都没有解决。下面贴上主要代码:

1、接口请参考上面文章

using NHibernate;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;

namespace XiaoRui.Data.NhibernateProvider
{

    /// <summary>
    /// Http Session管理
    /// </summary>
    class HttpSessionSource : ISessionStorage
    {
        private string name;
        private ISession session;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="name">session名称</param>
        public HttpSessionSource(string name)
        {
            this.name = name;
        }

        /// <summary>
        /// 获得ISession 
        /// </summary>
        /// <returns>获得的ISession</returns>
        public ISession Get()
        {
            // 很多人使用下面的方法,但内存占用很大
            // session = HttpContext.Current.Items[name] as ISession;

            //使用Cache缓存
            session = HttpContext.Current.Cache[name] as ISession;

            if (session != null)
            {
                // 这里很重要
                return session.SessionFactory.OpenSession();
            }

            return session;
        }

        /// <summary>
        /// 保存ISession
        /// </summary>
        /// <param name="value">需要保存的ISession</param>
        public void Set(ISession value)
        {
            if (value != null && !HttpContext.Current.Items.Contains(name))
            {
                //HttpContext.Current.Items.Add(name, value);
                HttpContext.Current.Cache.Insert(name, value);
            }
            else
            {
                HttpContext.Current.Items.Remove(name);
            }
        }

        public string Name
        {
            get
            {
                return this.name;
            }
            set
            {
                this.name = value;
            }
        }

    }
}

2、主要从Session管理者获取Session

using NHibernate;
using NHibernate.Cfg;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace XiaoRui.Data.NhibernateProvider
{
    /// <summary>
    /// session管理者
    /// </summary>
    class SessionManager
    {
        private static ISessionStorage storage;

        //Session工厂
        public static ISessionStorage SessionStorage
        {
            get { return storage; }
        }

        public SessionManager(string name)
        {
            storage = ISessionStorageFactory.GetSessionStorage(name);
        }

        /// <summary>
        /// 获取Session
        /// </summary>
        /// <returns></returns>
        public ISession GetSession()
        {
            ISession session = storage.Get();
            if (session == null)
            {
                session = CreateSession();
                storage.Set(session);
            }

            return session;
        }

        /// <summary>
        /// 创建Session
        /// </summary>
        /// <returns></returns>
        private ISession CreateSession()
        {
            Configuration config = new Configuration();
            config.Configure(storage.Name);
            ISession result = config.BuildSessionFactory().OpenSession();
            result.FlushMode = FlushMode.Always;    
            return result;
        }

    }
}
原文地址:https://www.cnblogs.com/chenrui7/p/3396829.html