参考: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;}} }