您的位置: 旅游网 > 影视

NHibernate中Session的处理

发布时间:2019-09-15 23:16:33

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;

}

}

}

查看本文来源

小便黄是吃什么药
孩子咳嗽厉害怎么办
糖尿病胃轻瘫便秘能吃啥药
小孩脾虚怎么调理
猜你会喜欢的
猜你会喜欢的