简体   繁体   English

NHibernate查找表缓存+ SqlCacheDependency

[英]NHibernate Lookup Table Caching + SqlCacheDependency

I'm trying to configure caching for my Lookup Tables using NHibernate's second-level caching provider SysCache2, and SqlCacheDependency. 我正在尝试使用NHibernate的第二级缓存提供程序SysCache2和SqlCacheDependency为查找表配置缓存。

I'm testing my framework on a single Countries table, but reading NHibernate's logs makes me understand that caching doesn't work .. And I don't know why. 我正在单个国家/地区表上测试我的框架,但是阅读NHibernate的日志可以使我理解缓存不起作用..而且我也不知道为什么。

I'm clueless :/ 我一无所有:/

SqlCacheDependency is enabled in the database and on the table LUT_Countries. 在数据库和表LUT_Countries中启用了SqlCacheDependency。

Web.Config: 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>

Fluent Configuration: 流利的配置:

        _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's Country Fluent Mapping: 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's Logs: NHibernate的日志:

... ...

14:20:53.544 : DEBUG : cache for: CountriesRegion usage strategy: read-only 14:20:53.544:调试:以下国家/地区的缓存:地区使用策略:只读

14:20:53.546 : WARN : read-only cache configured for mutable: CountriesRegion 14:20:53.546:警告:为可变配置的只读缓存:CountrysRegion

14:20:53.551 : DEBUG : building cache region, 'CountriesRegion', from configuration 14:20:53.551:调试:根据配置来构建缓存区域“ CountriesRegion”

14:20:53.559 : DEBUG : Configuring cache region 14:20:53.559:调试:配置缓存区域

14:20:53.559 : DEBUG : using priority: Default 14:20:53.559:调试:使用优先级:默认

14:20:53.559 : DEBUG : using relative expiration :7.00:00:00 14:20:53.559:调试:使用相对到期时间:7.00:00:00

14:20:53.571 : DEBUG : configuring sql table dependency, 'Countries' using table, 'LUT_Countries', and database entry. 14:20:53.571:调试:配置sql表依赖关系,使用表的“国家”,“ LUT_Countries”和数据库条目。 'Default' '默认'

... ...

14:20:53.811 : DEBUG : initializing class SessionFactoryObjectFactory 14:20:53.811:调试:初始化类SessionFactoryObjectFactory

14:20:53.813 : DEBUG : registered: 311e0b6b7e7a41b289b4347267f963f9(unnamed) 14:20:53.813:调试:注册:311e0b6b7e7a41b289b4347267f963f9(未命名)

14:20:53.813 : INFO : no name configured 14:20:53.813:信息:未配置名称

14:20:53.813 : DEBUG : Instantiated session factory 14:20:53.813:调试:实例化会话工厂

14:20:53.817 : INFO : starting update timestamps cache at region: UpdateTimestampsCache 14:20:53.817:信息:在以下区域开始更新时间戳缓存:UpdateTimestampsCache

14:20:53.817 : DEBUG : building non-configured cache region : UpdateTimestampsCache 14:20:53.817:调试:构建未配置的缓存区域:UpdateTimestampsCache

14:20:53.817 : DEBUG : Configuring cache region 14:20:53.817:调试:配置缓存区域

14:20:53.817 : DEBUG : no priority specified using default : Default 14:20:53.817:调试:未使用默认值指定优先级:默认

14:20:53.817 : DEBUG : no expiration specified using default : 00:05:00 14:20:53.817:调试:未使用默认值指定过期时间:00:05:00

14:20:53.819 : INFO : starting query cache at region: NHibernate.Cache.StandardQueryCache 14:20:53.819:信息:在以下区域启动查询缓存:NHibernate.Cache.StandardQueryCache

14:20:53.819 : DEBUG : building non-configured cache region : NHibernate.Cache.StandardQueryCache 14:20:53.819:调试:建立未配置的缓存区域:NHibernate.Cache.StandardQueryCache

14:20:53.819 : DEBUG : Configuring cache region 14:20:53.819:调试:配置缓存区域

14:20:53.819 : DEBUG : no priority specified using default : Default 14:20:53.819:调试:未使用默认值指定优先级:默认

14:20:53.819 : DEBUG : no expiration specified using default : 00:05:00 14:20:53.819:调试:未使用默认值指定过期时间:00:05:00

14:20:53.825 : DEBUG : Checking 0 named HQL queries 14:20:53.825:调试:检查0个命名的HQL查询

14:20:53.825 : DEBUG : Checking 0 named SQL queries 14:20:53.825:调试:检查0个命名的SQL查询

14:20:53.868 : DEBUG : [session-id=76cd9097-abc6-49f4-9fcb-2f5a0ca446ae] opened session at timestamp: 5622576143695872, for session factory: [/311e0b6b7e7a41b289b4347267f963f9] 14:20:53.868:调试:[session-id = 76cd9097-abc6-49f4-9fcb-2f5a0ca446ae]在时间戳为5622576143695872的会话工厂中打开了会话:[/ 311e0b6b7e7a41b289b4347267f963f9]

14:20:54.169 : DEBUG : Expression (partially evaluated): value(NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country]) 14:20:54.169:调试:表达式(部分评估):值(NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM.Models.Country])

14:20:54.191 : DEBUG : unable to locate HQL query plan in cache; 14:20:54.191:调试:无法在缓存中找到HQL查询计划; generating (NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country]) 生成(NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM.Models.Country])

14:20:54.922 : DEBUG : select << begin [level=1, statement=select] 14:20:54.922:调试:选择<<开始[级别= 1,语句=选择]

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

14:20:54.992 : DEBUG : Resolved : 0 -> country0 .Code 14:20:54.992:调试:已解决: 0-> country0 .Code

14:20:55.000 : DEBUG : select : finishing up [level=1, statement=select] 14:20:55.000:调试:选择:完成[级别= 1,声明=选择]

14:20:55.004 : DEBUG : processQuery() : ( SELECT ( {select clause} country0_.Code ) ( FromClause{level=1} LUT_Countries country0_ ) ) 14:20:55.004:调试:processQuery():( SELECT({select子句country0_.Code)(FromClause {level = 1} LUT_Countries country0_))

14:20:55.065 : DEBUG : Using FROM fragment [LUT_Countries country0_] 14:20:55.065:调试:使用FROM片段[LUT_Countries country0_]

14:20:55.070 : DEBUG : select >> end [level=1, statement=select] 14:20:55.070:调试:选择>>结束[级别= 1,语句=选择]

14:20:55.073 : DEBUG : throwQueryException() : no errors 14:20:55.073:调试:throwQueryException():无错误

14:20:55.199 : DEBUG : SQL: select country0_.Code as Code1_, country0_.Name as Name1_, country0_.Alpha3_IsoCode as Alpha3_1_, country0_.NumericCode as NumericC4_1_ from LUT_Countries country0_ 14:20:55.199:调试:SQL:从LUT_Countries country0_中选择country0_.Code作为Code1_,country0_.Name作为Name1_,country0_.Alpha3_IsoCode作为Alpha3_1_,country0_.NumericCode作为NumericC4_1_。

14:20:55.199 : DEBUG : throwQueryException() : no errors 14:20:55.199:调试:throwQueryException():没有错误

14:20:55.255 : DEBUG : located HQL query plan in cache (NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country]) 14:20:55.255:调试:在缓存中定位HQL查询计划(NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM.Models.Country])

14:20:55.263 : DEBUG : find: NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country] 14:20:55.263:调试:查找:NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM.Models.Country]

... ...

14:20:55.639 : DEBUG : result set row: 11 14:20:55.639:调试:结果集行:11

14:20:55.639 : DEBUG : returning 'AP' as column: Code1_ 14:20:55.639:调试:将“ AP”作为列返回:Code1_

14:20:55.639 : DEBUG : result row: EntityKey[Web.DataAccess.ORM.Models.Country#AP] 14:20:55.639:调试:结果行:EntityKey [Web.DataAccess.ORM.Models.Country#AP]

14:20:55.639 : DEBUG : Initializing object from DataReader: [Web.DataAccess.ORM.Models.Country#AP] 14:20:55.639:调试:从DataReader初始化对象:[Web.DataAccess.ORM.Models.Country#AP]

14:20:55.639 : DEBUG : Hydrating entity: [Web.DataAccess.ORM.Models.Country#AP] 14:20:55.639:调试:水化实体:[Web.DataAccess.ORM.Models.Country#AP]

14:20:55.639 : DEBUG : returning 'Asia/Pacific Region' as column: Name1_ 14:20:55.639:调试:返回“亚太地区”作为列:Name1_

14:20:55.639 : DEBUG : returning 'AP' as column: Alpha3_1_ 14:20:55.639:调试:返回“ AP”作为列:Alpha3_1_

14:20:55.639 : DEBUG : returning '0' as column: NumericC4_1_ 14:20:55.639:调试:返回“ 0”作为列:NumericC4_1_

14:20:55.639 : DEBUG : result set row: 12 14:20:55.639:调试:结果集行:12

... ...

14:20:55.701 : DEBUG : Closed IDataReader, open IDataReaders :0 14:20:55.701:调试:关闭IDataReader,打开IDataReaders:0

14:20:55.702 : DEBUG : DataReader was closed after 290 ms 14:20:55.702:调试:290毫秒后关闭了DataReader

14:20:55.704 : DEBUG : Closed IDbCommand, open IDbCommands: 0 14:20:55.704:调试:关闭IDbCommand,打开IDbCommands:0

14:20:55.707 : DEBUG : aggressively releasing database connection 14:20:55.707:调试:积极释放数据库连接

14:20:55.707 : DEBUG : Closing connection 14:20:55.707:调试:关闭连接

14:20:55.713 : DEBUG : total objects hydrated: 251 14:20:55.713:调试:水合对象总数:251

14:20:55.722 : DEBUG : resolving associations for [Web.DataAccess.ORM.Models.Country#A1] 14:20:55.722:调试:解析[Web.DataAccess.ORM.Models.Country#A1]的关联

14:20:55.730 : DEBUG : adding entity to second-level cache: [Web.DataAccess.ORM.Models.Country#A1] 14:20:55.730:调试:将实体添加到二级缓存中:[Web.DataAccess.ORM.Models.Country#A1]

14:20:55.736 : DEBUG : Caching: Web.DataAccess.ORM.Models.Country#A1 14:20:55.736:调试:缓存:Web.DataAccess.ORM.Models.Country#A1

14:20:55.740 : DEBUG : root cache item for region not found. 14:20:55.740:调试:找不到区域的根缓存项。

14:20:55.744 : DEBUG : Creating root cache entry for cache region: CountriesRegion 14:20:55.744:调试:为缓存区域:CountrysRegion创建根缓存条目

14:20:55.745 : DEBUG : Enlisting cache dependency for change notification 14:20:55.745:调试:为更改通知征集缓存依赖性

14:20:56.042 : DEBUG : Attaching cache dependencies to root cache entry. 14:20:56.042:调试:将缓存依赖项附加到根缓存条目。 Cache entry will be removed when change is detected. 检测到更改后,缓存条目将被删除。

14:20:56.045 : DEBUG : adding new data: key=NHibernate-Cache:CountriesRegion:Web.DataAccess.ORM.Models.Country#A1@-1467239096 & value=NHibernate.Cache.Entry.CacheEntry 14:20:56.045:调试:添加新数据:key = NHibernate-Cache:CountriesRegion:Web.DataAccess.ORM.Models.Country#A1@-1467239096&value = NHibernate.Cache.Entry.CacheEntry

14:20:56.047 : DEBUG : item will expire at: 07/08/2013 17:20:56 14:20:56.047:调试:项目将在以下日期过期:2013年7月8日

14:20:56.058 : DEBUG : done materializing entity [Web.DataAccess.ORM.Models.Country#A1] 14:20:56.058:调试:已实现实体[Web.DataAccess.ORM.Models.Country#A1]

14:20:56.061 : DEBUG : resolving associations for [Web.DataAccess.ORM.Models.Country#A2] 14:20:56.061:调试:解析[Web.DataAccess.ORM.Models.Country#A2]的关联

14:20:56.061 : DEBUG : adding entity to second-level cache: [Web.DataAccess.ORM.Models.Country#A2] 14:20:56.061:调试:将实体添加到二级缓存:[Web.DataAccess.ORM.Models.Country#A2]

14:20:56.061 : DEBUG : Caching: Web.DataAccess.ORM.Models.Country#A2 14:20:56.061:调试:缓存:Web.DataAccess.ORM.Models.Country#A2

... .. . .....


Second run, 5 seconds after results in a new SQL query, same as the first, and this outputs many of the following logs (returning values and registering in the cache: 第二次运行,在5秒钟后产生一个新SQL查询,与第一次查询相同,这将输出以下许多日志(返回值并在缓存中注册:


15:17:34.076 : DEBUG : [session-id=e1feb78d-6c3e-40a4-8b46-6d5742bd0f85] opened session at timestamp: 5622590071095296, for session factory: [/0ee3e73fbf6741d28adcff632c68b671] 15:17:34.076:调试:[session-id = e1feb78d-6c3e-40a4-8b46-6d5742bd0f85]在时间戳为5622590071095296的会话工厂中打开了会话:[/ 0ee3e73fbf6741d28adcff632c68b671]

15:17:34.077 : DEBUG : Expression (partially evaluated): value(NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country]) 15:17:34.077:调试:表达式(部分评估):值(NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM.Models.Country])

15:17:34.077 : DEBUG : located HQL query plan in cache (NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country]) 15:17:34.077:调试:在缓存中定位HQL查询计划(NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM.Models.Country])

15:17:34.077 : DEBUG : located HQL query plan in cache (NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country]) 15:17:34.077:调试:在缓存中定位HQL查询计划(NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM.Models.Country])

15:17:34.077 : DEBUG : find: NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country] 15:17:34.077:调试:查找:NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM.Models.Country]

15:17:34.077 : DEBUG : named parameters: {} 15:17:34.077:调试:命名参数:{}

15:17:34.077 : DEBUG : Opened new IDbCommand, open IDbCommands: 1 15:17:34.077:调试:打开新的IDbCommand,打开IDbCommands:1

15:17:34.077 : DEBUG : Building an IDbCommand object for the SqlString: select country0_.Code as Code1_, country0_.Name as Name1_, country0_.Alpha3_IsoCode as Alpha3_1_, country0_.NumericCode as NumericC4_1_ from LUT_Countries country0_ 15:17:34.077:调试:为SqlString构建IDbCommand对象:从LUT_Countries countrycountry0_选择country0_.Code作为Code1_,country0_.Name作为Name1_,country0_.Alpha3_IsoCode作为Alpha3_1_,country0_.NumericCode作为NumericC4_1_。

15:17:34.077 : INFO : select country0_.Code as Code1_, country0_.Name as Name1_, country0_.Alpha3_IsoCode as Alpha3_1_, country0_.NumericCode as NumericC4_1_ from LUT_Countries country0_ 15:17:34.077:信息:从LUT_Countries country0_中选择country0_.Code作为Code1_,country0_.Name作为Name1_,country0_.Alpha3_IsoCode作为Alpha3_1_,country0_.NumericCode作为NumericC4_1_。

15:17:34.078 : DEBUG : Obtaining IDbConnection from Driver 15:17:34.078:调试:从驱动程序获取IDbConnection

15:17:34.079 : DEBUG : ExecuteReader took 1 ms 15:17:34.079:调试:ExecuteReader用了1毫秒

15:17:34.079 : DEBUG : Opened IDataReader, open IDataReaders: 1 15:17:34.079:调试:打开IDataReader,打开IDataReaders:1

15:17:34.079 : DEBUG : processing result set 15:17:34.079:DEBUG:处理结果集

15:17:34.079 : DEBUG : result set row: 0 15:17:34.079:调试:结果集行:0

15:17:34.080 : DEBUG : returning 'A1' as column: Code1_ 15:17:34.080:调试:将“ A1”作为列返回:Code1_

15:17:34.080 : DEBUG : result row: EntityKey[Web.DataAccess.ORM.Models.Country#A1] 15:17:34.080:调试:结果行:EntityKey [Web.DataAccess.ORM.Models.Country#A1]

15:17:34.080 : DEBUG : Initializing object from DataReader: [Web.DataAccess.ORM.Models.Country#A1] 15:17:34.080:调试:从DataReader初始化对象:[Web.DataAccess.ORM.Models.Country#A1]

15:17:34.080 : DEBUG : Hydrating entity: [Web.DataAccess.ORM.Models.Country#A1] 15:17:34.080:调试:水化实体:[Web.DataAccess.ORM.Models.Country#A1]

15:17:34.080 : DEBUG : returning 'Anonymous Proxy' as column: Name1_ 15:17:34.080:调试:返回“匿名代理”作为列:Name1_

15:17:34.080 : DEBUG : returning 'A1' as column: Alpha3_1_ 15:17:34.080:调试:将“ A1”作为列返回:Alpha3_1_

15:17:34.080 : DEBUG : returning '0' as column: NumericC4_1_ 15:17:34.080:调试:将“ 0”作为列返回:NumericC4_1_

15:17:34.080 : DEBUG : result set row: 1 15:17:34.080:调试:结果集行:1

... ...

You should run this in a transaction and commit the transaction at the end. 您应该在事务中运行它,并在最后提交事务。

NHibernate updates the 2nd level cache only if the transaction has been committed successfully. NHibernate仅在成功提交事务后才更新第二级缓存。 If you don't start a NHibernate transaction, NHibernate will not know if the results are good enough to be cached. 如果您不启动NHibernate事务,则NHibernate将不知道结果是否足以缓存。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM