<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      nhibernate性能之二級緩存篇

       1.學習目標
         通過進一步學習nhibernate,了解二級緩存在nhiernate中的工作機制以及使用方法
      2.開發環境和必要準備
          開發環境為:windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition
        必要準備:學習前五篇nhibernate學習系列Nhibernate學習之起步篇-1  ,Nhibernate學習起步之many-to-one篇 ,Nhibernate學習之many-to-many篇 ,nhibernate學習之三級聯(Ternary Associations)篇Nhibernate學習之性能改善1
      3.學前分析
         在買電腦的時候,我們經常會看CPU的配置,其中衡量CPU性能的一項指標為二級緩存-Level 2 Cache,二級緩存越大,CPU性能越高。這是為什么,大家知道CPU的處理速度非常快,比在內存(memory)中的操作快上很多倍,這樣在系統運行的時候,勢必會造成一定的瓶頸效應,在內存和CPU之間加上一塊處理速度在內存和處理器之間的介質-高速緩存,可以起到平衡的作用,每次CPU都試圖先從高速緩存中讀取數據,如果沒有的話,再去內存中讀取,一般CPU對高速緩存的命中率都在90%以上,所以大大提高了性能。在內存和磁盤之間加上一個高速緩存也可提高系統的新性能,減少對磁盤的IO次數
      4.如何在nhibernate中啟動二級緩存
         在nhiernate中的ISession對象中,已經存在了一級緩存,但是在ISession級別的,我們從上一節可以看出,ISession對象應該是盡早釋放的,那依賴它的一級緩存會在它銷毀的地時候銷毀,所以一級緩存命中率比較低。而ISessionFactory對象推薦為不頻繁創建,非常適用于Cache的使用,那這里的二級緩存正是ISessionFactory級別的。
        要想在nhibernate中啟用二級緩存,請在hibernate.cfg.xml中添加如下代碼:

      <property name="hibernate.cache.provider_class">NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache</property>
              
      <property name="expiration">120</property>

      NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache還可以替換為NHibernate.Caches.Prevalence.PrevalenceCacheProvider, NHibernate.Caches.Prevalence,代表緩存的實現類,在bin目錄中有這樣兩個dll
      NHibernate.Caches.SysCache.dll,NHibernate.Caches.Prevalence.dll用哪個就把哪個拷貝到應用程序的bin目錄下 
       expiration代表緩存過期時間,單位S
      設置完后,還需要在對象的映射文件中配置二級緩存的策略,比如我在User.hbm.xml中如下配置

      <?xml version="1.0" encoding="utf-8" ?>
      <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
        
      <class name="NhibernateSample1.User,NhibernateSample1" table="Users" lazy="false">
          
      <cache usage="read-write"/>
          
      <id name="Id" column="Id" unsaved-value="0">
            
      <generator class="native" />
          
      </id>
          
      <property name="Name" column="Name" type="string" length="64" not-null="true" unique="true"></property>
          
      <property name="Pwd"  column="Pwd"  type="string" length="64" not-null="true"></property>
          
      <many-to-one name="Role"  class="NhibernateSample1.Role,NhibernateSample1" column="RoleID"></many-to-one>
         
      </class>
      </hibernate-mapping>

      NHibernateHelper.cs

      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\simple4\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();
                  }

              }

          }


      }


      頁面代碼:
       System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
                  sw.Start();
                  ISession session 
      = NHibernateHelper.GetCurrentSession();
                  ITransaction tra 
      = session.BeginTransaction();
                  session.Load(
      typeof(NhibernateSample1.User), 1);
                  tra.Commit();           
                  sw.Stop();
                  Response.Write(sw.ElapsedTicks
      +"<br>");
                  sw.Reset();
                  sw.Start();
                  session 
      = NHibernateHelper.GetCurrentSession();
                  tra 
      = session.BeginTransaction();
                  session.Load(
      typeof(NhibernateSample1.User), 1);
                  tra.Commit();           
                  sw.Stop();
                  Response.Write(sw.ElapsedTicks 
      + "<br>");
                  sw.Reset();
                  sw.Start();
                  session 
      = NHibernateHelper.GetCurrentSession();
                  session.Close();
                  sw.Stop();
                  Response.Write(sw.ElapsedTicks 
      + "<br>");
      第一次運行,用SQL事件探查器,結果為

      從截圖中的SQL語句看,第一次從數據庫中加在User數據
      第二次

      從圖中可以看出,第二次加載User對象,并沒有從數據中獲取數據,而是將沒有設置Cache的Role信息從User里面獲取。
      當然在利用緩存的時候,緩存不會知道另外一個進程存儲的實體發生變化,應該自己建立一些策略來及時地更新緩存快照。而且當ISessionFactory銷毀的時候,二級緩存也會隨之銷毀,這也是應用的時候,應該注意的。今天先寫到這,有點困了。
      posted @ 2007-04-02 23:13  Robin Zhang  閱讀(7491)  評論(10)    收藏  舉報
      主站蜘蛛池模板: 巨爆乳中文字幕爆乳区| 欧美精品一产区二产区| 国产不卡一区不卡二区| 最新亚洲人成网站在线观看| 乱色欧美激惰| 温宿县| 久久热在线视频精品视频| 国产av不卡一区二区| 精品一区精品二区制服| 中文字幕不卡在线播放 | 午夜性刺激在线观看| 亚洲高清有码中文字| 中文字幕无码免费久久9一区9 | 国产另类ts人妖一区二区| 狠狠色婷婷久久综合频道日韩 | 色噜噜亚洲男人的天堂| 成人啪精品视频网站午夜| 国产精品自拍视频第一页| 精品一区二区三区四区五区| 久久国产乱子伦免费精品无码 | 97在线碰| 国产伦一区二区三区视频| 亚洲欧美自偷自拍视频图片| 大港区| 一本久久a久久精品综合| 亚洲国产精品久久久天堂麻豆宅男 | 97视频精品全国免费观看| 大陆精大陆国产国语精品| 色综合久久中文综合久久激情 | 亚洲精品乱码久久久久久蜜桃图片| 高清有码国产一区二区| 米泉市| 国产成人高清亚洲一区二区| 无码人妻丝袜在线视频| 日韩av一区二区不卡在线| 亚洲av午夜福利精品一区二区| 久久久久久人妻一区精品| 成人亚洲国产精品一区不卡| 无码av岛国片在线播放| 一区二区三区人妻无码| 国产极品尤物粉嫩在线观看|