今天比較鬱悶,想修改下NHibernate設定檔以最佳化下效能,於是想跟蹤下各個操作下產生的產生的 sql
唉,我這麼懶的人首先想到的就是在網上找下已有的方法,結果讓人失望的很啊。網上能給出答案的還真沒被我看到,
都是些沒思考過就亂回答的人,什麼show_sql=“true”,我靠,這隻能從控制台看到撒,嗎的,現在還有幾個應用是
控制台應用啊?
於是就只能自己找方法了,終於,在我翻閱NHibernate 2.0還是2.1的原始碼的時候讓我找到了NHibernate對外的介面了
淚奔啊,記錄下來,與大家分享。其實就是Interceptor的應用, 源碼中Interceptor的預設實現是EmptyInterceptor,下面列出
該實現中我說的介面:
view source
print?
01 [Serializable]
02 public class EmptyInterceptor : IInterceptor
03 {
04
05 //前面省略n行代碼
06 public SqlString OnPrepareStatement(SqlString sql)
07 {
08 return sql;
09 }
10 }
view source
print?
1 public class MyInterceptor : EmptyInterceptor
2 {
3 public override NHibernate.SqlCommand.SqlString OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
4 {
5 return base.OnPrepareStatement(sql);
6 }
7 }
我們要做的就是繼承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最優,^_^.