前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nhibernate学习之性能改善1

Nhibernate学习之性能改善1

作者头像
全栈程序员站长
发布2022-08-04 09:44:32
2160
发布2022-08-04 09:44:32
举报
文章被收录于专栏:全栈程序员必看

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

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

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

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

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

在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 NHibernateHelpe

{

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跟踪结果为:

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

从执行时间来看

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> “ );

执行结果为:

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档