科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Nhibernate学习之性能改善

Nhibernate学习之性能改善

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文试图从最表层的对象入手,以后逐渐增加其他方面的性能分析。

作者:ghost 来源:CSDN 2007年9月24日

关键字: ghost NHibernate

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

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

在web应用程序里面,将ISessionFactory对象放到预缓存里面,可以避免频繁创建ISessionFactory对象。如
using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using NHibernate;using NHibernate.Cfg;namespace WebApp{    public sealed class NHibernateHelper    {        private const string CurrentSessionKey = "nhibernate.current_session";        private static readonly ISessionFactory sessionFactory;        static NHibernateHelper()        {            string cfgPath = @"E:\my project\nhibernate study\simle 1\NHibernateStudy1\NhibernateSample1\hibernate.cfg.xml";            sessionFactory = new NHibernate.Cfg.Configuration().Configure(cfgPath).BuildSessionFactory();        }        public static ISession GetCurrentSession()        {            HttpContext context = HttpContext.Current;            ISession currentSession = context.Items[CurrentSessionKey] as ISession;            if (currentSession == null)            {                currentSession = sessionFactory.OpenSession();                context.Items[CurrentSessionKey] = currentSession;            }            return currentSession;        }        public static void CloseSession()        {            HttpContext context = HttpContext.Current;            ISession currentSession = context.Items[CurrentSessionKey] as ISession;            if (currentSession == null)            {                // No current session                return;            }            currentSession.Close();            context.Items.Remove(CurrentSessionKey);        }        public static void CloseSessionFactory()        {            if (sessionFactory != null)            {                sessionFactory.Close();            }        }    }}

用dottrace跟踪结果为:

从执行时间来看
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();            sw.Start();            ISession 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>");            sw.Reset();            sw.Start();            session = NHibernateHelper.GetCurrentSession();            session.Close();            sw.Stop();            Response.Write(sw.ElapsedTicks + "<br>");
执行结果为:
 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1738267

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章