随笔 - 5,  文章 - 0,  评论 - 114,  阅读 - 18769
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

  今天比较郁闷,想修改下NHibernate配置文件以优化下性能,于是想跟踪下各个操作下产生的生成的sql      
唉,我这么懒的人首先想到的就是在网上找下已有的方法,结果让人失望的很啊。网上能给出答案的还真没被我看到,
都是些没思考过就乱回答的人,什么show_sql=“true”,我靠,这只能从控制台看到撒,吗的,现在还有几个应用是
控制台应用啊?  
  于是就只能自己找方法了,终于,在我翻阅NHibernate 2.0还是2.1的源代码的时候让我找到了NHibernate对外的接口了
泪奔啊,记录下来,与大家分享。其实就是Interceptor的应用,  源码中Interceptor的默认实现是EmptyInterceptor,下面列出
该实现中我说的接口:

1
2
3
4
5
6
7
8
9
10
         [Serializable]
public class EmptyInterceptor : IInterceptor
{
 
    //前面省略n行代码
    public SqlString OnPrepareStatement(SqlString sql)
    {
        return sql;
    }
}
1
2
3
4
5
6
7
public class MyInterceptor : EmptyInterceptor
   {
      public override NHibernate.SqlCommand.SqlString OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
       {
           return base.OnPrepareStatement(sql);
       }
   }

我们要做的就是继承EmptyInterceptor,重写OnPrepareStatement()方法,重写方法里面就是你大展拳脚的地方了,
想写文件写文件,想输出到页面就输出到页面,什么都不做都可以,如上

 

怎么用呢?

 

 

复制代码
代码
public override void Update(Admin entity)
{
ISession session
= HibernateTemplate.SessionFactory.OpenSession(new MyIntercepotr);
session.Update(entity);
session.Flush();
}
复制代码

在你想要查看的操作中,打开session 的时候添加上自定义的拦截器就可以了,想给所有的操作都配置的话就要用到全局配置文件了。
不过我一般都不会用。
      我这么懒的人什么都不做的,重写OnPrepareStatement()的时候一句话都不改,我只是在这里打一个断点而已,我只要看看生成的
sql语句就行了,然后去修改配置文件再来debug,确认怎么配置生产的sql最优,^_^.


 

posted on   xx念  阅读(3541)  评论(4编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示