zoukankan      html  css  js  c++  java
  • Nhibernate学习之性能改善1

    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>");
    执行结果为:


  • 相关阅读:
    OCP 062【中文】考试题库(cuug内部资料)第19题
    OCP 062【中文】考试题库(cuug内部资料)第18题
    OCP 062【中文】考试题库(cuug内部资料)第17题
    743. 网络延迟时间 力扣(中等) 最短路径SPFA,不熟练
    1337. 矩阵中战斗力最弱的 K 行 力扣(简单) 确实简单,结构体排序,二分也可
    171. Excel 表列序号 力扣(简单) 想不明白的题
    987. 二叉树的垂序遍历 力扣(困难) bfs+hash+优先队列 感觉还是简单的,就是复杂了点
    46. 全排列 力扣(中等) 容器或回溯
    1947. 最大兼容性评分和 周赛 力扣(中等) 排列next_permutation用法
    1104. 二叉树寻路 力扣(中等) 数学题,思考久了
  • 原文地址:https://www.cnblogs.com/jillzhang/p/686079.html
Copyright © 2011-2022 走看看