Nhibernate学习之性能改善1

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

大家好,又见面了,我是你们的朋友全栈君。

1.学习目标

    通过几天来大家对Nhiberate的反映,很多人对它的性能非常的担心,本文便着手从最直观的角度和方法中逐步改善nhiberate的性能。改善性能是需要做出很多分析和测试的,本文试图从最表层的对象入手,以后逐渐增加其他方面的性能分析。希望各位看官莫要着急。

 2. 分析:

    ISession和ISessionFactory对象的产生,使用,和销毁对性能的影响。 

    ISessionFactory对象是线程安全的,它可以被程序的任意线程所适用,但是创建它的性能开销是比较大的。所以不要频繁创建ISessionFactroy对象

    ISession对象是非线程安全的,创建它的开销比较小 

    创建一个ISessionFactory对象的主要流程有:

      
Nhibernate学习之性能改善1

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

 
Nhibernate学习之性能改善1

在web应用程序里面,将ISessionFactory对象放到预缓存里面,可以避免频繁创建ISessionFactory对象。如

None.gif
using
 System;
None.gif

using
 System.Data;
None.gif

using
 System.Configuration;
None.gif

using
 System.Web;
None.gif

using
 System.Web.Security;
None.gif

using
 System.Web.UI;
None.gif

using
 System.Web.UI.WebControls;
None.gif

using
 System.Web.UI.WebControls.WebParts;
None.gif

using
 System.Web.UI.HtmlControls;
None.gif

using
 NHibernate;
None.gif

using
 NHibernate.Cfg;
None.gif
None.gif
None.gif

namespace
 WebApp
ExpandedBlockStart.gifContractedBlock.gif

dot.gif
{

InBlock.gif    
public sealed class NHibernateHelper
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{

InBlock.gif        
private const string CurrentSessionKey = nhibernate.current_session;
InBlock.gif        
private static readonly ISessionFactory sessionFactory;
InBlock.gif
InBlock.gif        
static NHibernateHelper()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{

InBlock.gif            
string cfgPath = @”E:\my project\nhibernate study\simle 1\NHibernateStudy1\NhibernateSample1\hibernate.cfg.xml;
InBlock.gif            sessionFactory 
= new NHibernate.Cfg.Configuration().Configure(cfgPath).BuildSessionFactory();
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public static ISession GetCurrentSession()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{

InBlock.gif            HttpContext context 
= HttpContext.Current;
InBlock.gif            ISession currentSession 
= context.Items[CurrentSessionKey] as ISession;
InBlock.gif
InBlock.gif            
if (currentSession == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{

InBlock.gif                currentSession 
= sessionFactory.OpenSession();
InBlock.gif                context.Items[CurrentSessionKey] 
= currentSession;
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
return currentSession;
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public static void CloseSession()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{

InBlock.gif            HttpContext context 
= HttpContext.Current;
InBlock.gif            ISession currentSession 
= context.Items[CurrentSessionKey] as ISession;
InBlock.gif
InBlock.gif            
if (currentSession == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{

InBlock.gif                
// No current session
InBlock.gif
                return;
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            currentSession.Close();
InBlock.gif            context.Items.Remove(CurrentSessionKey);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public static void CloseSessionFactory()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{

InBlock.gif            
if (sessionFactory != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{

InBlock.gif                sessionFactory.Close();
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}


None.gif

用dottrace跟踪结果为:


Nhibernate学习之性能改善1

从执行时间来看

None.gif
    System.Diagnostics.Stopwatch sw 
=
 
new
 System.Diagnostics.Stopwatch();
None.gif            sw.Start();
None.gif            ISession session 

=
 NHibernateHelper.GetCurrentSession();
None.gif            session.Close();
None.gif            sw.Stop();
None.gif            Response.Write(sw.ElapsedTicks

+

<br>

);
None.gif            sw.Reset();
None.gif            sw.Start();
None.gif            session 

=
 NHibernateHelper.GetCurrentSession();
None.gif            session.Close();
None.gif            sw.Stop();
None.gif            Response.Write(sw.ElapsedTicks 

+
 

<br>

);
None.gif            sw.Reset();
None.gif            sw.Start();
None.gif            session 

=
 NHibernateHelper.GetCurrentSession();
None.gif            session.Close();
None.gif            sw.Stop();
None.gif            Response.Write(sw.ElapsedTicks 

+
 

<br>

);

执行结果为:


Nhibernate学习之性能改善1

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107093.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月21日 上午10:40
下一篇 2022年4月21日 上午10:40


相关推荐

  • 一周 10 万 Star 的 OpenClaw,我花 4 天把它变成了 80+技能的私人全能助手

    一周 10 万 Star 的 OpenClaw,我花 4 天把它变成了 80+技能的私人全能助手

    2026年3月15日
    3
  • c51单片机流水灯程序汇编语言,基于51单片机的流水灯程序

    c51单片机流水灯程序汇编语言,基于51单片机的流水灯程序LED流水灯的开发在51单片机中再常见不过了,主要是让大家掌握IO的操作是单片机控制最基本的要求。根据开发流程,我们先查看选型的单片机的资源和控制寄存器,然后在软件上实现控制。在这里芯片我们采用STC15W404AS作为开发的硬件平台,在这里我们用该单片机的P1引脚来驱动LED实现流水灯的功能。如图是LED连接的硬件电路,可以看到8颗LED是阳极通过限流电阻共同连接到VCC上的,也就是说当LED…

    2022年5月7日
    78
  • 使用e.target.dataset出现的问题

    使用e.target.dataset出现的问题

    2021年3月12日
    156
  • Java 定时任务实现原理详解[通俗易懂]

    在jdk自带的库中,有两种技术可以实现定时任务。一种是使用Timer,另外一个则是ScheduledThreadPoolExecutor。下面为大家分析一下这两个技术的底层实现原理以及各自的优缺点。一、Timer1.Timer的使用classMyTaskextendsTimerTask{@Overridepublicvoidrun(){…

    2022年4月10日
    66
  • 方便实用——六款在线图片处理工具

    方便实用——六款在线图片处理工具PS已经不是唯一的照片处理方式了,你可以通过傻瓜式的图像处理工具来处理你的数码照片,你也可以选择在线图像处理网站来编辑你的数码照片,这样你不需要任何专业的图像处理技术就能制作出绚丽的专业数码照片效果,

    2022年7月3日
    24
  • Android 显示刷新机制、VSYNC和三重缓存机制

    Android 显示刷新机制、VSYNC和三重缓存机制Android显示刷新机制、VSYNC和三重缓存机制为了理解APP是如何进行渲染的,我们就必须了解手机硬件是如何工作的,也必须理解什么是VSYNC。首先,我们需要了解2个相关概念:刷新率(RefreshRate):代表了屏幕在一秒内刷新屏幕的次数,这取决于硬件的固定参数,例如60Hz。帧率(FrameRate):代表了GPU在一秒内绘制操作的帧数,例如30fps,60fps。GPU会获取图形数据进行渲染,然后硬件负责把渲染后的内容呈现到屏幕上,他们两者不停的进行协作。

    2022年5月21日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号