NHibernate系列文章四:NHibernate运行时监控
摘要
有三种方式可以实现NHibernate运行时监控,监控的信息包括:执行了的SQL语句、NHibernate执行过程、数据库性能分析。这对我们学习NHibernate有很大的帮助,在工作中也能快速定位问题,最好是能够掌握他们。
1. LogSqlInConsole
修改上一节的SessionFactory属性,添加行x.LogSqlInConsole = true;
public static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
var cfg = new Configuration(); cfg.DataBaseIntegration(x =>
{
x.ConnectionString = "Data Source=localhost;Initial Catalog=NHibernateDemoDB;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
x.Driver<SqlClientDriver>();
x.Dialect<MsSql2008Dialect>();
x.LogSqlInConsole = true;
});
cfg.AddAssembly(Assembly.GetExecutingAssembly());
_sessionFactory = cfg.BuildSessionFactory();
}
return _sessionFactory;
}
}
修改main函数,只保留调用GetAll方法的语句
static void Main(string[] args)
{
IList<Customer> list = GetAll();
Console.WriteLine("customer list count: {0}", list.Count);
foreach(var item in list)
{
Console.WriteLine("{0} {1}", item.FirstName, item.LastName);
}
Console.ReadLine();
}
运行程序得到结果:

可以看到,NHibernate自动生成了SQL查询语句。
2. 使用NHibernateProfile
从NHibernateProfile下载。目前版本是3.0。
下载后解压缩,执行文件NHProf.exe。按照提示注册一个trial license,发送license的xml文件到注册邮箱,登录注册邮箱,将license的xml文件从收件箱拿下到本地,导入license的xml文件。
导入后,看到这个窗口。

从解压后的文件夹中找到dll文件HibernatingRhinos.Profiler.Appender.dll,将他copy到工程目录的$\packages文件夹下,在工程中添加引用这个文件。
修改main函数首行添加代码HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize();
static void Main(string[] args)
{
HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize();
IList<Customer> list = GetAll();
Console.WriteLine("customer list count: {0}", list.Count);
foreach(var item in list)
{
Console.WriteLine("{0} {1}", item.FirstName, item.LastName);
}
Console.ReadLine();
}
执行程序,得到NHibernateProfile监控窗口。

NHibernate Profile不但可以监控到执行的sql语句,而且能够抓取到NHibernate执行过程以及显示Hibernate异常详细信息。
3. 使用Microsoft SQL Server自带的工具SQL Server Profile
在Microsoft SQL Server Management Studio里,选择Tools->SQL Server Profile,在弹出对话框中输入连接的用户名和密码后,点击"OK",来到如下窗口:

选择"Events Selection",将Audt Login / Logout和ExistingConnection前面的勾去掉(这里只关心我们应用程序执行的SQL语句),点击"Run"。

来到这个窗口:

再次执行程序,得到监控结果:

这里有更详细的数据库性能信息,比如每条语句用了多长时间、应用进程ID等。
NHibernate系列文章四:NHibernate运行时监控的更多相关文章
- NHibernate系列文章目录
第一章:NHibernate基础 NHibernate介绍 第一个NHibernate工程 简单的增删改查询 运行时监控 NHibernate配置 数据类型映射 Get/Load方法 NHiberna ...
- NHibernate系列文章十八:NHibernate关系之一对多(附程序下载)
摘要 这篇文章介绍NHibernate最实用的内容:关系映射. NHibernate的关系映射方式有三种: Set:无序对象集合,集合中每一个元素不能重复. List:有序对象集合,集合中的元素可以重 ...
- NHibernate系列文章二十七:NHibernate Mapping之Fluent Mapping基础(附程序下载)
摘要 从这一节起,介绍NHibernate Mapping的内容.前面文章都是使用的NHibernate XML Mapping.NHibernate XML Mapping是NHibernate最早 ...
- NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)
摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ...
- NHibernate系列文章二十一:延迟加载
摘要 NHibernate的延迟加载机制是很重要的内容.通过关系映射将数据库表之间的关系映射成对象之间的关系,如果没有延迟加载机制,从主表的一个对象的查询将直接查询出所有与该对象关联的其他对象,如果关 ...
- NHibernate系列文章一:NHibernate介绍
摘要 NHibernate是一个成熟的开源的面向对象的.net映射框架.大量的实际项目中正在使用该框架.他是建立在ADO.Net基础之上.目前的版本是NHibernate 4.0.4.本系列文章都是基 ...
- NHibernate系列文章十五:NHibernate组件
摘要 前面文章介绍了NHibernate对简单.net数据类型的映射对照表.NHibernate也可以映射复杂数据类型,这里介绍通过组件映射NHibernate值对象. 1. NHibernate引用 ...
- NHibernate系列文章九:NHibernate对象二级缓存上
摘要 NHibernate的二级缓存由SessionFactory管理,由所有Session共享. NHibernate缓存读取顺序: 首先从一级缓存中读取,如果一级缓存对象存在,则读取一级缓存对象并 ...
- NHibernate系列文章十:NHibernate对象二级缓存下
摘要 上一节对NHibernate二级缓存做了简单介绍,NHibernate二级缓存是由SessionFactory管理的,所有Session共享.这一节介绍二级缓存其他两个方面:二级缓存查询和二级缓 ...
随机推荐
- 在MAC OS X上如何启用crontab?
project: blog target: how-to-enable-crontab-on-osx.md date: 2015-12-16 status: publish tags: - OS X ...
- CBC和CTR解密模式——C++实现
利用已经封装好的AES加密算法,实现CBC模式加密和CTR模式加密. (1)CBC解密 如图,CBC模式的解密,步骤主要有三个,首先是拿密文段逐一放到AES解密盒子里面得到一个结果temp(事先要把密 ...
- js:setTimeout 与 setInterval 比较
在javascript中有两个非常有用的函数:setTimeout 和setInterval ,都是定时器:但是两者存在着一些区别: 1. setTimeout函数 用法:setTimeout(fn, ...
- python数据结构与算法——二叉树结构与遍历方法
先序遍历,中序遍历,后序遍历 ,区别在于三条核心语句的位置 层序遍历 采用队列的遍历操作第一次访问根,在访问根的左孩子,接着访问根的有孩子,然后下一层 自左向右一一访问同层的结点 # 先序遍历 # ...
- LintCode First Position of Target
找指定target的最左位置. class Solution { /** * @param nums: The integer array. * @param target: Target to fi ...
- frame和bounds区别
学习ios开发有一段时间了,项目也做了两个了,今天看视频,突然发现view的frame和bound两个属性,发现bound怎么也想不明白,好像饶你了死胡同里,经过一番尝试和思考,终于弄明白bound的 ...
- **stack smashing detecting**
stack smashing aborted 堆 猛烈撞击 流失 我在使用数据时写了 tmp_row = row + pos[num1][[0]; tmp_col = col + pos[num1][ ...
- springMVC返回json
<mvc:annotation-driven> <mvc:message-converters register-defaults="true"> < ...
- 自定义webkit搜索框样式
好吧,这是个有点儿蛋疼的文章,每个浏览器都可以有自己的行为和表现,只是webkit在apple的带领下,在UI上走的更远了一点儿,但是却给我们带来了点儿困扰,因为很多情况下,我们希望搜索框在所有的浏览 ...
- [原创]cocos2d-x研习录-第二阶 概念类之场景类(CCScene)
场景类CCScene是Cocos2D-x在屏幕显示的内容,相当于游戏关卡或界面.CCDirector任何时候只能显示一个场景CCScene,游戏中可能存在若干场景,CCDirector通过场景切换达到 ...