Nhibernate学习之性能改善1

本文针对NHibernate框架的性能问题进行探讨,重点分析了ISession和ISessionFactory对象的使用方式及其对性能的影响,并提供了一个在Web应用环境中复用ISessionFactory实例的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.学习目标
通过几天来大家对Nhiberate的反映,很多人对它的性能非常的担心,本文便着手从最直观的角度和方法中逐步改善nhiberate的性能。改善性能是需要做出很多分析和测试的,本文试图从最表层的对象入手,以后逐渐增加其他方面的性能分析。希望各位看官莫要着急。
2. 分析:
ISession和ISessionFactory对象的产生,使用,和销毁对性能的影响。
ISessionFactory对象是线程安全的,它可以被程序的任意线程所适用,但是创建它的性能开销是比较大的。所以不要频繁创建ISessionFactroy对象
ISession对象是非线程安全的,创建它的开销比较小
创建一个ISessionFactory对象的主要流程有:

这期间,包括对多个xml文件的解析和格式验证,验证的过程还包括对对象的反射。这些对性能损失非常大。用dottrace跟踪程序执行,如下

在web应用程序里面,将ISessionFactory对象放到预缓存里面,可以避免频繁创建ISessionFactory对象。如
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingNHibernate;
usingNHibernate.Cfg;


namespaceWebApp
{
publicsealedclassNHibernateHelper
{
privateconststringCurrentSessionKey="nhibernate.current_session";
privatestaticreadonlyISessionFactorysessionFactory;

staticNHibernateHelper()
{
stringcfgPath=@"E:/myproject/nhibernatestudy/simle1/NHibernateStudy1/NhibernateSample1/hibernate.cfg.xml";
sessionFactory
=newNHibernate.Cfg.Configuration().Configure(cfgPath).BuildSessionFactory();
}


publicstaticISessionGetCurrentSession()
{
HttpContextcontext
=HttpContext.Current;
ISessioncurrentSession
=context.Items[CurrentSessionKey]asISession;

if(currentSession==null)
{
currentSession
=sessionFactory.OpenSession();
context.Items[CurrentSessionKey]
=currentSession;
}


returncurrentSession;
}


publicstaticvoidCloseSession()
{
HttpContextcontext
=HttpContext.Current;
ISessioncurrentSession
=context.Items[CurrentSessionKey]asISession;

if(currentSession==null)
{
//Nocurrentsession
return;
}


currentSession.Close();
context.Items.Remove(CurrentSessionKey);
}


publicstaticvoidCloseSessionFactory()
{
if(sessionFactory!=null)
{
sessionFactory.Close();
}

}

}


}


用dottrace跟踪结果为:

从执行时间来看
System.Diagnostics.Stopwatchsw=newSystem.Diagnostics.Stopwatch();
sw.Start();
ISessionsession
=NHibernateHelper.GetCurrentSession();
session.Close();
sw.Stop();
Response.Write(sw.ElapsedTicks
+"<br>");
sw.Reset();
sw.Start();
session
=NHibernateHelper.GetCurrentSession();
session.Close();
sw.Stop();
Response.Write(sw.ElapsedTicks
+"<br>");
sw.Reset();
sw.Start();
session
=NHibernateHelper.GetCurrentSession();
session.Close();
sw.Stop();
Response.Write(sw.ElapsedTicks
+"<br>");
执行结果为:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值