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;
} }
}
Nhibernate的Session管理的更多相关文章
- NHibernate系列文章十七:NHibernate Session管理(附程序下载)
摘要 NHibernate的Session的管理涉及到NHibernate的两个最重要的对象ISessionFactory和ISession.ISessionFactory的生成非常消耗资源,通常都在 ...
- NHibernate中Session的处理 线程不安全
NHibernate中Session是线程不安全的,而且每次数据库操作 请求创建Session时对性能有些影响.在Windows应用中可以通过 [ThreadStatic]特性很简单的就可以实现线程安 ...
- Openfire的启动过程与session管理
说明 本文源码基于Openfire4.0.2. Openfire的启动 Openfire的启动过程非常的简单,通过一个入口初始化lib目录下的openfire.jar包,并启动一个 ...
- ABP(现代ASP.NET样板开发框架)系列之7、ABP Session管理
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之7.ABP Session管理 ABP是“ASP.NET Boilerplate Project (ASP.NET ...
- 2016-1-30 Servlet中Session管理(Sesssion追踪)
Session管理(Sesssion追踪)是Web应用程序开发中非常重要的一个主题.这是因为HTTP是无状态的,在默认情况下,Web服务器不知道一个HTTP请求是来自初次用户,还是来自之前已经访问过的 ...
- Redis3.2+Tomcat实现集群的Session管理 -- tomcat-redis-session-manager的编译和开发部署环境搭建
已经有不少文章介绍使用tomcat-redis-session-manager来实现Redis存储Tomcat的Session,实现分布式Session管理.但是现在官方编译的tomcat-redis ...
- tomcat架构分析 (Session管理)
Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...
- Session管理解决方案笔记
大型网站Session管理解决方案: 1. web服务器之间的session复制. 优点:方案成熟 缺点:复制的性能开销大 2. 减少session使用,使用客户端存储cookie ...
- 使用Memcached Session Manager扩展Session管理
>>Tomcat的session管理 在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中. 然后再从request获取sessi ...
随机推荐
- UWP 律师查询 MVVM
APP简介 律师查询是基于聚合数据的律师查询接口做的,这个接口目前处于停用状态,但是,由于我是之前申请的,所以,还可以用,应该是无法再申请了. 效果图 开发 一.HttpHelper 既然是请求接口的 ...
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...
- Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新
因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...
- redis 学习笔记(2)
redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...
- NET Core-学习笔记(三)
这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...
- ASP.NET MVC开发日常一:SessionID合理清除
在MVC Web开发中临时存储数据一般会用到Session,Cookie,ViewBag,ViewData,TempData.每个的使用场景是不同,具体区别有空再补上. Session数据最敏感,最需 ...
- CSS 3 学习——transform 3D转换渲染
以下内容根据官方规范翻译,没有翻译关于SVG变换的内容和关于矩阵计算的内容. 一般情况下,元素在一个无景深无立体感的平面(flat plane)上渲染,这个平面就是其包含块所处的平面.同时,页面上的其 ...
- JS鼠标事件大全 推荐收藏
一般事件 事件 浏览器支持 描述 onClick HTML: 2 | 3 | 3.2 | 4 Browser: IE3 | N2 | O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDb ...
- npm源切换
版权声明:欢迎转载,请附加转载来源:一路博客(http://www.16boke.com) 目录(?)[+] 安装 使用 列出可选的源 切换 增加源 删除源 测试速度 许可 项目主页 我们介绍 ...
- NodeJS使用mysql
1.环境准备 手动添加数据库依赖: 在package.json的dependencies中新增, "mysql" : "latest", { "nam ...