2013-07-01 50 views
0

我想配置我的查找表使用NHibernate的二級緩存提供程序SysCache2和SqlCacheDependency的緩存。NHibernate查找表緩存+ SqlCacheDependency

我在單個國家的表上測試我的框架,但閱讀NHibernate的日誌讓我明白,緩存不起作用..而我不知道爲什麼。

我無言以對:/

的SqlCacheDependency是在數據庫和表LUT_Countries啓用。

的Web.Config:

<system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <caching> 
     <sqlCacheDependency enabled="true" pollTime="30000"> <!-- --> 
      <databases> 
       <clear /> 
       <add name="Default" connectionStringName="Test" /> 
      </databases> 
     </sqlCacheDependency> 
    </caching> 
</system.web> 

<syscache2> 
    <cacheRegion name="CountriesRegion" relativeExpiration="604800"> 
     <dependencies> 
      <tables> 
       <add name="Countries" databaseEntryName="Default" tableName="LUT_Countries" /> 
      </tables> 
     </dependencies> 
    </cacheRegion> 
</syscache2> 

流利的配置:

 _baseConfiguration = Fluently.Configure() 
            .ExposeConfiguration(c => 
            { 
             c.SetProperty("connection.isolation", "ReadCommitted"); 
             c.SetProperty("show_sql", "true"); 
             c.SetProperty("format_sql", "true"); 
            }) 
            .Database(MsSqlConfiguration.MsSql2008.ConnectionString(_connectionString)) 
            .Cache(c => c.ProviderClass<SysCacheProvider>() 
                   .UseSecondLevelCache() 
                   .UseQueryCache()); 

NHibernate的國家流利的映射:

public class CountryMap : ClassMap<Country> 
{ 
    public CountryMap() 
    { 
     Cache.IncludeAll().ReadOnly().Region("CountriesRegion"); 

     Table("LUT_Countries"); 

     Id(c => c.Code); 

     Map(c => c.Name); 
     Map(c => c.Alpha3IsoCode).Column("Alpha3_IsoCode"); 
     Map(c => c.NumericCode); 
    } 
} 

NHibernate的日誌:

...

14:20:53.544:DEBUG:緩存:CountriesRegion使用策略:只讀

14:20:53.546:WARN:只讀配置用於可變緩存:CountriesRegion

14:20 :53.551:DEBUG:建築緩存區域, 'CountriesRegion',從配置

14:20:53.559:DEBUG:配置高速緩存區域

14:20:53.559:DEBUG:使用優先:默認

14:20:53.559:DEBUG:使用相對到期:7.00:00:00

14:20:53.571:DEBUG:配置SQL表依賴性, '國家' 使用表 'LUT_Countries',和數據庫條目。 '默認'

...

14:20:53.811:DEBUG:初始化類SessionFactoryObjectFactory

14:20:53.813:DEBUG:註冊:311e0b6b7e7a41b289b4347267f963f9(未命名)

14:20 :53.813:INFO:沒有名字配置

14:20:53.813:DEBUG:實例化會話工廠

14:20:53.817: INFO:開始更新在區域時間戳緩存:UpdateTimestampsCache

14:20:53.817:DEBUG:建築非配置的高速緩存區域:UpdateTimestampsCache

14:20:53.817:DEBUG:配置高速緩存區域

14 :20:53。817:調試:沒有使用默認指定的優先級:默認

14:20:53.817:DEBUG:00:05:00

14:20:53.819:INFO:開始查詢緩存在使用默認指定沒有到期區域:NHibernate.Cache.StandardQueryCache

14:20:53.819:DEBUG:建築非配置的高速緩存區域:NHibernate.Cache.StandardQueryCache

14:20:53.819:DEBUG:配置高速緩存區域

14:20:53.819:DEBUG:沒有使用默認指定的優先級:默認

14:20:53.819:DEBUG:00:05:00

14:20:53.825:DEBUG:使用默認指定沒有到期檢查0命名HQL查詢

14:20:53.825:DEBUG:在時間戳[會話id = 76cd9097-abc6-49f4-9fcb-2f5a0ca446ae]打開的會話:命名SQL檢查0查詢

14:20:53.868:DEBUG 5622576143695872,用於會話工廠:[/ 311e0b6b7e7a41b289b4347267f963f9]

14:20:54.169:DEBUG:表達式(部分評估):值(NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM.Models.Country])

14:20:54.191:DEBUG:無法將HQL查詢計劃定位到緩存中;生成(NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM.Models.Country])

14:20:54.922:DEBUG:選擇< <開始[級別= 1,語句=選擇]

14:20:54.957:​​DEBUG:FromClause {級別= 1}:Web.DataAccess.ORM.Models.Country(0) - > country0

14:20:54.992:DEBUG:解決:0 - > country0。代碼

14:20:55.000:DEBUG:select:finish up [leve L = 1,語句=選擇]

14:20:55.004:DEBUG:processQuery():(SELECT({選擇子句} country0_.Code)(FromClause {級別= 1} LUT_Countries country0_))

14:20:55.065:DEBUG:使用從片段[LUT_Countries country0_]

14:20:55.070:DEBUG:選擇>>端[級別= 1,語句=選擇]

14:20:55.073: DEBUG:throwQueryException():無錯誤

14:20:55.199:DEBUG:SQL:select country 0_.Code如Code1_,country0_.Name如Name1_,country0_.Alpha3_IsoCode如Alpha3_1_,country0_.NumericCode如NumericC4_1_從LUT_Countries country0_

14:20:55.199:DEBUG:throwQueryException():沒有錯誤

14: 20:55.255:DEBUG:位於緩存中的HQL查詢計劃(NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM.Models。國家])

14:20:55.263:DEBUG:發現:NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM.Models.Country]

...

14:20: 55.639:DEBUG:結果集行:11

14:20:55.639:DEBUG:返回 'AP' 爲柱:Code1_

14:20:55.639:DEBUG:結果列:的EntityKey [Web.DataAccess。 ORM.Models.Country#AP]

14:20:55.639 DEBUG:從DataReader初始化對象:[Web.DataAccess.ORM.Models.Country#AP]

14:20:55.639:調試:保溼實體:[Web.DataAccess.ORM.Models .Country#AP]

14:20:55.639:DEBUG:返回 '亞洲/太平洋地區' 爲列:Name1_

14:20:55.639:DEBUG:返回 'AP' 作爲列:Alpha3_1_

14:20:55.639:DEBUG:返回'0'列:NumericC4_1_

14:20:55.639:DEBUG:結果集行:12

...

14:20:55.701:DEBUG:封閉的IDataReader,開放IDataReaders:0

14:20:55.702: DEBUG:20:55.704:DEBUG:封閉IDbCommand的,開放的IDbCommands:0

14:20:55.707:DEBUG:積極釋放數據庫連接

DataReader的是後290毫秒

14關閉3210

14:20:55.707:DEBUG:關閉連接

14:20:55.713:DEBUG:總對象的水合:251

14:20:55.722:DEBUG:解決用於關聯[Web.DataAccess.ORM .Models.Country#A1]

14:20:55.730:DEBUG:將實體到第二級高速緩存:[Web.DataAccess.ORM.Models.Country#A1]

14:20:55.736: DEBUG:緩存:Web.DataAccess.ORM.Models.Country#A1

14:20:55。 740:DEBUG:未找到區域的根緩存項目。

14:20:55.744:DEBUG:創建緩存區域根高速緩存條目:CountriesRegion

14:20:55.745:DEBUG:變更通知謀取緩存依賴性

14:20:56.042:DEBUG :將緩存依賴關係附加到根緩存條目。當檢測到更改時,緩存條目將被刪除。

14:20:56.045:DEBUG:添加新數據:key = NHibernate-Cache:CountriesRegion:Web.DataAccess.ORM.Models.Country#[email protected] & value = NHibernate。Cache.Entry.CacheEntry

14:20:56.047:DEBUG:項目將在到期:2013年7月8日17點20分56秒

14:20:56.058:DEBUG:做物化實體[網絡。 DataAccess.ORM.Models.Country#A1]

14:20:56.061:DEBUG:解析爲[Web.DataAccess.ORM.Models.Country#A2]

14協會:20:56.061:DEBUG:將實體添加到二級緩存:[Web.DataAccess.ORM.Models.Country#A2]

14:20:56.061:DEBUG:Cach ing:Web.DataAccess.ORM.Models.Country#A2

... .. 。


第二次運行,在一個新的SQL查詢結果5秒後,同第一, 和此輸出許多以下日誌的(返回值,並在高速緩存中註冊:


15:17:34.076:DEBUG:[會話id = e1feb78d-6c3e-40a4-8b46-6d5742bd0f85]使用時刻打開的會話:5622590071095296,用於會話工廠:[/ 0ee3e73fbf6741d28adcff632c68b671]

15:17:34.077:DEBUG:表達式(部分評估):值(NHibernate。 Linq.NhQueryable`1 [Web.DataAccess.ORM.Models.Country])

15:17:34.077:DEBUG:位於緩存中的HQL查詢計劃(NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM。 Models.Country])

15:17:34.077:DEBUG:在高速緩存位於HQL查詢計劃(NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM.Models.Country])

15時17分:34.077:DEBUG:發現:NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM.Models.Country]

15:17:34.077:DEBUG:命名參數:{}

15:17:34.077:DEBUG:打開新IDbCommand的,開放IDbCommands:1

15:17:34.077:DEBUG:構建爲一個的SqlString對象IDbCommand的:選擇country0_.Code如Code1_,country0_.Name如Name1_ ,country0_.Alpha3_IsoCode如Alpha3_1_,country0_.NumericCode如NumericC4_1_從LUT_Countries country0_

15:17:34.077:INFO:選擇country0_.Code如Code1_,country0_.Name如Name1_,country0_.Alpha3_IsoCode如Alpha3_1_,country0_.NumericCode如NumericC4_1_ from LUT_Countries country0_

15:17:34.078:DEBUG:從驅動程序獲取IDbConnection

15:17:34.079:DEBUG:的ExecuteReader耗時1毫秒

15:17:34.079:DEBUG:打開的IDataReader,開放IDataReaders:1

15:17:34.079:DEBUG:加工結果集

15:17:34。079:調試:結果集行:0

15:17:34.080:DEBUG:返回 'A1' 作爲柱:Code1_

15:17:34.080:DEBUG:結果列:的EntityKey [Web.DataAccess。 ORM.Models.Country#A1]

15:17:34.080:DEBUG:從初始化的DataReader對象:[Web.DataAccess.ORM.Models.Country#A1]

15:17:34.080:DEBUG:保溼實體:[Web.DataAccess.ORM.Models.Country#A1]

15:17:34.080:DEBUG:returns'Anonym的OU代理」作爲柱:Name1_

15:17:34.080:DEBUG:返回 'A1' 作爲柱:Alpha3_1_

15:17:34.080:DEBUG:返回 '0' 作爲柱:NumericC4_1_

15:17:34.080:DEBUG:結果集行:1

...

回答

0

你應該在一個事務中運行此,並在年底提交事務。

僅當事務已成功提交時,NHibernate纔會更新第二級緩存。如果你不啓動一個NHibernate事務,NHibernate將不知道結果是否足夠緩存。