扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:中国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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者