NHibernate Session-per-request and MiniProfiler.NHibernate
NHibernate Session-per-request and MiniProfiler.NHibernate
前言
1、本文以mvc3为例,借鉴开源项目 NerdDnner项目完成nhibernate中的 Session-per-request 模式,本文创建了一个自定义的httpmodel类,来实现在http请求的时候创建并开启一个session并绑定到CurrentSessionContext中,当请求完成以后关闭,同时包含对事物的处理。
2、利用MiniProfiler.NHibernate来追踪项目中的产生的sql,便于我们及时发现问题及时处理。MiniProfiler.NHibernate现在可以在nuget上直接获取或者可以去github中下载源码查看。
实现Session per request

- public class NHibernateSessionPerRequest : IHttpModule
- {
- private static readonly ISessionFactory sessionFactory;
- //构造函数
- static NHibernateSessionPerRequest()
- {
- sessionFactory = CreateSessionFactory();
- }
- // 初始化httpmodel
- public void Init( HttpApplication context )
- {
- context.BeginRequest += BeginRequest;
- context.EndRequest += EndRequest;
- }
- public void Dispose() { }
- public static ISession GetCurrentSession()
- {
- return sessionFactory.GetCurrentSession();
- }
- // 打开session, 开启事务, 绑定session到CurrentSessionContext
- private static void BeginRequest( object sender, EventArgs e )
- {
- ISession session = sessionFactory.OpenSession();
- session.BeginTransaction();
- CurrentSessionContext.Bind( session );
- }
- // 移除session会话, 事物提交, and 关闭session会话
- private static void EndRequest( object sender, EventArgs e )
- {
- ISession session = CurrentSessionContext.Unbind( sessionFactory );
- if ( session == null ) return;
- try
- {
- session.Transaction.Commit();
- }
- catch ( Exception )
- {
- session.Transaction.Rollback();
- }
- finally
- {
- session.Close();
- session.Dispose();
- }
- }
- // 创建sessionfactory
- private static ISessionFactory CreateSessionFactory()
- {
- return Fluently.Configure(new Configuration().Configure())
- .Mappings( m => m.AutoMappings.Add( CreateMappings() ) )
- .ExposeConfiguration( UpdateSchema )
- .CurrentSessionContext<WebSessionContext>()
- .BuildSessionFactory();
- }
- private static AutoPersistenceModel CreateMappings()
- {
- return AutoMap
- .Assembly( System.Reflection.Assembly.GetCallingAssembly() )
- .Where( t => t.Namespace != null && t.Namespace.EndsWith( "Models" ) )
- .Conventions.Setup( c => c.Add( DefaultCascade.SaveUpdate() ) );
- }
- // 生成数据库架构
- private static void UpdateSchema( Configuration cfg )
- {
- new SchemaUpdate( cfg )
- .Execute( false, true );
- }
- }

此类的nh的配置采用fluent的方式配置映射,可以生成数据库架构,ISessionFactory在每次请求中只会生成一次,当我们需要session的时候只需调用GetCurrentSession方法,当http请求的时候session创建并存储在CurrentSessionContext.Bind()中,并开启事物操作,当请求结束的时候 CurrentSessionContext.Unbind()移除session,事物提交并将session关闭。这里存在一些问题:尽管session是非常轻量级的,这样每一次http请求都会去创建session,并不能做到我们真正需要的时候去创建。
注册httpmodel:
在web.config中添加如下2处节点:
测试程序
Models:


Repositories:


HomeController:


完成以后,修改hibernate.cfg.xml中的链接字符串等,并将其属性复制到输出目录修改为:如果较新则复制,运行程序请求index方法,将会产生数据库架构。
配置MiniProfiler.NHibernate
1、使用nuget控制台Install-Package MiniProfiler.NHibernate安装,或者参考github中的代码自己写一个
2、修改NH配置文件中的数据库驱动类,将connection.driver_class几点替换为

- <property name="connection.driver_class">
- StackExchange.Profiling.NHibernate.Drivers.MiniProfilerSql2008ClientDriver,StackExchange.Profiling.NHibernate
- </property>

3、在模板页中中的<head>节点添加@MiniProfiler.RenderIncludes()方法调用,修改Global.asax,添加如下代码:

- protected void Application_BeginRequest()
- {
- if (Request.IsLocal)
- {
- MiniProfiler.Start();
- }
- }
- /// <summary>
- /// 终止时结束
- /// </summary>
- protected void Application_EndRequest()
- {
- MiniProfiler.Stop();
- }

配置完成后运行程序,便可以看到MiniProfiler.NHibernate的效果了,使用它可以帮我们监控nh产生的sql及时优化代码,举个例子,运行请求home/seed的测试数据方法,看看追踪的效果
文章结束,时间仓促代码粗略,文中若有不合理的地方,欢迎批评指正。
NHibernate Session-per-request and MiniProfiler.NHibernate的更多相关文章
- NHibernate系列文章十七:NHibernate Session管理(附程序下载)
摘要 NHibernate的Session的管理涉及到NHibernate的两个最重要的对象ISessionFactory和ISession.ISessionFactory的生成非常消耗资源,通常都在 ...
- 架构之路(九)Session Per Request
前面的两篇反应很差:没评论没赞.很伤心啊,为什么呢?搞得我好长一段时间都没更新了——呵呵,好吧,我承认,这只是我的借口.不过,还是希望大家多给反馈.没有反馈,我就只能猜了:前面两篇是不是写得太“粗”了 ...
- NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)
摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ...
- NHibernate系列文章二:创建NHibernate工程
摘要 这篇文章介绍了如何创建一个简单的使用NHibernate的控制台应用程序,包括使用NuGet.简单的配置.单表映射.对NHibernate配置文件添加智能提示.使用ISessionFactory ...
- NHibernate 数据查询之Linto to NHibernate (第八篇)
NHibernate 数据查询之Linto to NHibernate (第八篇) 刚学NHibernate的时候觉得,HQL挺好用的,但是终归没有与其他技术 相关联,只有NHibernate用到,一 ...
- Unable to make the session state request to the session state server处理
Server Error in '/' Application. Unable to make the session state request to the session state serve ...
- 用struts2获取session、request、parmeter的方法
package com.hanqi.action; import java.util.Map; import com.opensymphony.xwork2.ActionContext; public ...
- 获取session、request、parmeter的方法
package com.hanqi.action; import java.util.Map; import com.opensymphony.xwork2.ActionContext; public ...
- 在IIS上发布项目后浏览时报的错:Unable to make the session state request to the session state server
错误描述: Unable to make the session state request to the session state server. Please ensure that the A ...
随机推荐
- [使用]Git--命令行
如何利用终端命令将文件上传到github远程服务器 (1) git status 命令查看下状态. (2) git pull 更新代码,确保代码是库上最新代码,防止覆盖其他人的提交. (3) git ...
- easyui dataBox 增加一天,减少一天
<table> <tr> <td><a href="javascript:void(0)" class="easyui-link ...
- mono for android 学习记录
C#开发Android应用实战(全 扫描 中文版) 学习记录: 拖完控件后,不要急着按F5,需要重新生成,才能自动修改 Resource.Designer.cs 文件 1. Activity 是基于a ...
- linux c socket programming
原文:linux c socket programming http://54min.com/post/http-client-examples-using-c.html 好文章 PPT http:/ ...
- C# ---- 串口数据YSI实例
原文:C# ---- 串口数据YSI实例 C#----串口数据接收发送中,发送接收数据已经可以模拟了. 本次YSI实例过程中 主要是:类型转换问题 .计算校验码 一.不同设备不同的规则,本次实例代码如 ...
- jmeter之GUI运行原理
一.一语道破jmeter 大家都知道我们在应用jmeter的图形化界面来进行操作,保存后生成的是一个.jmx文件. 那么这个.jmx文件中都是些什么呢. <?xml ve ...
- Installshield停止操作系统进程的代码--IS5版本适用
原文:Installshield停止操作系统进程的代码--IS5版本适用 出处:http://www.installsite.org/pages/en/isp_ext.htm这个地址上有不少好东西,有 ...
- 快速构建Windows 8风格应用8-贴靠视图
原文:快速构建Windows 8风格应用8-贴靠视图 本篇博文主要介绍如何切换出贴靠视图.关于贴靠视图的设计.关于贴靠视图的应用程序栏和如何实现贴靠视图. 如何切换出贴靠视图 第一步:水平方向全屏视图 ...
- NET Web开发
.NET Web开发初学者必知的四个网站 No.1 W3school 链接: http://www.w3school.com.cn/ 预览: 介绍: 全球最大Web前端技术教程网站.内容涵盖从基础 ...
- 使用八种牛云存储解决方案ios7.1的app部署问题
使用八种牛云存储解决方案ios7.1的app部署问题 一个.问题叙述性说明 开发完ios版本号的app.须要将.ipa文件和.plist文件打包上传,供用户下载,在线安装.用户安装过程简单描写叙述例如 ...