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 ...
随机推荐
- Responsive Design in 3 Steps
Responsive web design is no doubt a big thing now. If you still not familiar with responsive design, ...
- Coreseek:索引和检测的第二步骤施工
1,非常索引easy,代码行 g:/service/coreseek/bin/indexer -c g:/service/coreseek/etc/csft_mysql.conf person 在 ...
- Apache无法启动解决 the requested operation has failed
Apache不能启动解决办法 原因一:80端口占用例如IIS,另外就是迅雷. 原因二:软件冲突装了某些软件会使apache无法启动如Dr.com 你打开网络连接->TcpIp属性->高级- ...
- Java替换字符或十进制数的字符串
如今,这个项目的需求:将"甲状腺结节 5*3 cm" 更换 "甲状腺结节 * cm". 在一个字符串的数字来替换空白. 码,如以下: public static ...
- JAVA学习课第五十三届 — IO流程(七)File打靶 & Properties设置
一个.锻炼 深度遍历目录 深度遍历非常自然而然想到递归,而递归就非常自然的想到事实上现的底层算法是栈 对指定文件夹下列出全部内容(包括子文件夹的内容) PS:建议不要遍历C盘 import java. ...
- 软件project(六)——需求分析
需求分析是软件开发期的第一个阶段,是关系到软件开发成败的关键步骤.需求分析的任务就是明白系统必须完毕那些工作,以下是对需求分析这一章做的简要总结. 导图: 解释说明: 我将 ...
- UUShutdown关机工具 - 给 Windows8.1Metro 开始屏幕添加 关机重启按钮
UUShutdown,给开始屏幕(开始菜单)添加重启关机等按钮 如图: 安装完成之后找到开始菜单程序文件夹中的快捷方式,附加到开始屏幕即可. 2.0加入主程序界面,支持换肤和定时: 看见的需要那就拿去 ...
- Windows版Cacti全新安装与升级
全新安装 Cacti运行依赖的软件很多,mysql.PHP.Apache.Spine.rrd等,一个一个的安装非常繁琐,而且还容易出错,全新安装的话可以采用论坛提供的windows安装包安装,非常简单 ...
- MVC5模板部署到mono
VS2013中的MVC5模板部署到mono上的艰辛历程 2014-10-27 09:30 by FuzhePan, 3954 阅读, 46 评论, 收藏, 编辑 部署环境:CentOS7 + Mono ...
- leetcode第十题--Regular Expression Matching
Problem:Implement regular expression matching with support for '.' and '*'. '.' Matches any single c ...