Nhibernate学习之性能改善1

1.学习目标
通过几天来大家对Nhiberate的反映,很多人对它的性能非常的担心,本文便着手从最直观的角度和方法中逐步改善nhiberate的性能。改善性能是需要做出很多分析和测试的,本文试图从最表层的对象入手,以后逐渐增加其他方面的性能分析。希望各位看官莫要着急。
2. 分析:
ISession和ISessionFactory对象的产生,使用,和销毁对性能的影响。
ISessionFactory对象是线程安全的,它可以被程序的任意线程所适用,但是创建它的性能开销是比较大的。所以不要频繁创建ISessionFactroy对象
ISession对象是非线程安全的,创建它的开销比较小
创建一个ISessionFactory对象的主要流程有:
Nhibernate学习之性能改善1
这期间,包括对多个xml文件的解析和格式验证,验证的过程还包括对对象的反射。这些对性能损失非常大。用dottrace跟踪程序执行,如下
Nhibernate学习之性能改善1
在web应用程序里面,将ISessionFactory对象放到预缓存里面,可以避免频繁创建ISessionFactory对象。如
Nhibernate学习之性能改善1usingSystem;
Nhibernate学习之性能改善1
usingSystem.Data;
Nhibernate学习之性能改善1
usingSystem.Configuration;
Nhibernate学习之性能改善1
usingSystem.Web;
Nhibernate学习之性能改善1
usingSystem.Web.Security;
Nhibernate学习之性能改善1
usingSystem.Web.UI;
Nhibernate学习之性能改善1
usingSystem.Web.UI.WebControls;
Nhibernate学习之性能改善1
usingSystem.Web.UI.WebControls.WebParts;
Nhibernate学习之性能改善1
usingSystem.Web.UI.HtmlControls;
Nhibernate学习之性能改善1
usingNHibernate;
Nhibernate学习之性能改善1
usingNHibernate.Cfg;
Nhibernate学习之性能改善1
Nhibernate学习之性能改善1
Nhibernate学习之性能改善1
namespaceWebApp
Nhibernate学习之性能改善1Nhibernate学习之性能改善1
Nhibernate学习之性能改善1{
Nhibernate学习之性能改善1
publicsealedclassNHibernateHelper
Nhibernate学习之性能改善1Nhibernate学习之性能改善1
Nhibernate学习之性能改善1{
Nhibernate学习之性能改善1
privateconststringCurrentSessionKey="nhibernate.current_session";
Nhibernate学习之性能改善1
privatestaticreadonlyISessionFactorysessionFactory;
Nhibernate学习之性能改善1
Nhibernate学习之性能改善1
staticNHibernateHelper()
Nhibernate学习之性能改善1Nhibernate学习之性能改善1
Nhibernate学习之性能改善1{
Nhibernate学习之性能改善1
stringcfgPath=@"E:/myproject/nhibernatestudy/simle1/NHibernateStudy1/NhibernateSample1/hibernate.cfg.xml";
Nhibernate学习之性能改善1sessionFactory
=newNHibernate.Cfg.Configuration().Configure(cfgPath).BuildSessionFactory();
Nhibernate学习之性能改善1}

Nhibernate学习之性能改善1
Nhibernate学习之性能改善1
publicstaticISessionGetCurrentSession()
Nhibernate学习之性能改善1Nhibernate学习之性能改善1
Nhibernate学习之性能改善1{
Nhibernate学习之性能改善1HttpContextcontext
=HttpContext.Current;
Nhibernate学习之性能改善1ISessioncurrentSession
=context.Items[CurrentSessionKey]asISession;
Nhibernate学习之性能改善1
Nhibernate学习之性能改善1
if(currentSession==null)
Nhibernate学习之性能改善1Nhibernate学习之性能改善1
Nhibernate学习之性能改善1{
Nhibernate学习之性能改善1currentSession
=sessionFactory.OpenSession();
Nhibernate学习之性能改善1context.Items[CurrentSessionKey]
=currentSession;
Nhibernate学习之性能改善1}

Nhibernate学习之性能改善1
Nhibernate学习之性能改善1
returncurrentSession;
Nhibernate学习之性能改善1}

Nhibernate学习之性能改善1
Nhibernate学习之性能改善1
publicstaticvoidCloseSession()
Nhibernate学习之性能改善1Nhibernate学习之性能改善1
Nhibernate学习之性能改善1{
Nhibernate学习之性能改善1HttpContextcontext
=HttpContext.Current;
Nhibernate学习之性能改善1ISessioncurrentSession
=context.Items[CurrentSessionKey]asISession;
Nhibernate学习之性能改善1
Nhibernate学习之性能改善1
if(currentSession==null)
Nhibernate学习之性能改善1Nhibernate学习之性能改善1
Nhibernate学习之性能改善1{
Nhibernate学习之性能改善1
//Nocurrentsession
Nhibernate学习之性能改善1
return;
Nhibernate学习之性能改善1}

Nhibernate学习之性能改善1
Nhibernate学习之性能改善1currentSession.Close();
Nhibernate学习之性能改善1context.Items.Remove(CurrentSessionKey);
Nhibernate学习之性能改善1}

Nhibernate学习之性能改善1
Nhibernate学习之性能改善1
publicstaticvoidCloseSessionFactory()
Nhibernate学习之性能改善1Nhibernate学习之性能改善1
Nhibernate学习之性能改善1{
Nhibernate学习之性能改善1
if(sessionFactory!=null)
Nhibernate学习之性能改善1Nhibernate学习之性能改善1
Nhibernate学习之性能改善1{
Nhibernate学习之性能改善1sessionFactory.Close();
Nhibernate学习之性能改善1}

Nhibernate学习之性能改善1}

Nhibernate学习之性能改善1}

Nhibernate学习之性能改善1
Nhibernate学习之性能改善1}

Nhibernate学习之性能改善1

用dottrace跟踪结果为:
Nhibernate学习之性能改善1
从执行时间来看
Nhibernate学习之性能改善1System.Diagnostics.Stopwatchsw=newSystem.Diagnostics.Stopwatch();
Nhibernate学习之性能改善1sw.Start();
Nhibernate学习之性能改善1ISessionsession
=NHibernateHelper.GetCurrentSession();
Nhibernate学习之性能改善1session.Close();
Nhibernate学习之性能改善1sw.Stop();
Nhibernate学习之性能改善1Response.Write(sw.ElapsedTicks
+"<br>");
Nhibernate学习之性能改善1sw.Reset();
Nhibernate学习之性能改善1sw.Start();
Nhibernate学习之性能改善1session
=NHibernateHelper.GetCurrentSession();
Nhibernate学习之性能改善1session.Close();
Nhibernate学习之性能改善1sw.Stop();
Nhibernate学习之性能改善1Response.Write(sw.ElapsedTicks
+"<br>");
Nhibernate学习之性能改善1sw.Reset();
Nhibernate学习之性能改善1sw.Start();
Nhibernate学习之性能改善1session
=NHibernateHelper.GetCurrentSession();
Nhibernate学习之性能改善1session.Close();
Nhibernate学习之性能改善1sw.Stop();
Nhibernate学习之性能改善1Response.Write(sw.ElapsedTicks
+"<br>");
执行结果为:
Nhibernate学习之性能改善1