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 ...
随机推荐
- php传引用和全局变量
原文:php传引用和全局变量 <?php /* * 函数内部改变变量的值两种方法 */ $a = 10; /* *方法一 :函数参数传引用 */ function methodOne(& ...
- python元类分析
刚開始接触到Python新式类中的元类的概念的时候非常是纠结了下..不知道这是个啥东西... 用下面几个定义来说明吧: (1)Python中,类也是对象..仅仅只是这样的对象比較的特殊,他用于创建别的 ...
- MVC应用程序使用Wcf Service
原文:MVC应用程序使用Wcf Service 前一篇Insus.NET有演示过MVC应用程序使用Web Service, 此篇Insus.NET想继续演示Service,不过是WCF Service ...
- IBM、京东、携程、eBay 的 OpenStack 云
我所了解的 IBM.京东.携程.eBay 的 OpenStack 云 参加过几次 OpenStack meetup 活动,听过这几家公司的Architect 讲他们公司的 OpenStack产品.本文 ...
- 转载:Eclipse+Spket插件+ExtJs4修改版提供代码提示功能[图]
转载:Eclipse+Spket插件+ExtJs4修改版提供代码提示功能[图] ExtJs是一种主要用于创建前端用户界面,是一个基本与后台技术无关的前端ajax框架.功能丰富,无人能出其右.无论是界面 ...
- java压缩zip文件中文乱码问题(转——作者:riching)
本人遇到了同样的问题,用了以下方案,奇迹般的解决了.我很纳闷为什么,经理说:好读书,不求甚解,不要问为什么... 用java来打包文件生成压缩文件,有两个地方会出现乱码 1.内容的中文乱码问题,这个问 ...
- thrift js javascript C# Csharp webservice
http://www.cnblogs.com/xxxteam/archive/2013/04/15/3023159.html 利用thrift实现js与C#通讯的例子 关键字:thrift js ja ...
- OCP-1Z0-051-题目解析-第12题
12. You need to produce a report where each customer's credit limit has been incremented by $1000. I ...
- 异步提交form的时候利用jQuery validate实现表单验证
异步提交form的时候利用jQuery validate实现表单验证相信很多人都用过jquery validate插件,非常好用,并且可以通过下面的语句来自定义验证规则 // 电话号码验证 ...
- GIMP也疯狂之动态图的制作(一)
写在前面的话:本系列gimp教程已首发在Linux吧(Go),之所以重新发表是因为便于博主分类并且可以重新整理,用作记录.本系列的侧重不是GIF的教程,而是gimp教程,想更好的制作GIF图片请使用专 ...