我正在尝试使用 NHibernate 的二级缓存提供程序 SysCache2 和 SqlCacheDependency 为我的查找表配置缓存。
我在一个国家表上测试我的框架,但是阅读 NHibernate 的日志让我明白缓存不起作用..而且我不知道为什么。
我一无所知:/
SqlCacheDependency 在数据库和表 LUT_Countries 上启用。
网络配置:
<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 的 Country Fluent 映射:
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:调试:缓存:国家地区使用策略:只读
14:20:53.546:警告:为可变配置的只读缓存:CountriesRegion
14:20:53.551:调试:从配置中构建缓存区域“CountriesRegion”
14:20:53.559:调试:配置缓存区域
14:20:53.559:调试:使用优先级:默认
14:20:53.559:调试:使用相对到期时间:7.00:00:00
14:20:53.571:调试:配置 sql 表依赖关系、使用表的“国家”、“LUT_Countries”和数据库条目。'默认'
...
14:20:53.811:调试:初始化类 SessionFactoryObjectFactory
14:20:53.813:调试:注册:311e0b6b7e7a41b289b4347267f963f9(未命名)
14:20:53.813:信息:未配置名称
14:20:53.813:调试:实例化会话工厂
14:20:53.817:INFO:在区域开始更新时间戳缓存:UpdateTimestampsCache
14:20:53.817:调试:构建未配置的缓存区域:UpdateTimestampsCache
14:20:53.817:调试:配置缓存区域
14:20:53.817:调试:没有使用默认值指定优先级:默认值
14:20:53.817:调试:使用默认值没有指定过期时间:00:05:00
14:20:53.819:INFO:在区域开始查询缓存:NHibernate.Cache.StandardQueryCache
14:20:53.819:调试:构建未配置的缓存区域:NHibernate.Cache.StandardQueryCache
14:20:53.819:调试:配置缓存区域
14:20:53.819:调试:没有使用默认值指定优先级:默认值
14:20:53.819:调试:使用默认值指定没有过期:00:05:00
14:20:53.825:调试:检查 0 个命名的 HQL 查询
14:20:53.825:调试:检查 0 个命名 SQL 查询
14:20:53.868:调试:[session-id=76cd9097-abc6-49f4-9fcb-2f5a0ca446ae] 在时间戳打开会话:5622576143695872,对于会话工厂:[/311e0b6b7e7a41b289b4347267f963f9]
14:20:54.169:调试:表达式(部分评估):值(NHibernate.Linq.NhQueryable`1 [Web.DataAccess.ORM.Models.Country])
14:20:54.191:调试:无法在缓存中找到 HQL 查询计划;生成(NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country])
14:20:54.922:调试:选择<<开始[级别=1,语句=选择]
14:20:54.957:调试:FromClause{level=1}:Web.DataAccess.ORM.Models.Country(0)-> country0
14:20:54.992:调试:已解决: 0 -> country0 .Code
14:20:55.000 : DEBUG : select : 完成 [level=1, statement=select]
14:20:55.004:调试:processQuery():(SELECT({select 子句} country0_.Code)(FromClause{level=1} LUT_Countries country0_))
14:20:55.065:调试:使用 FROM 片段 [LUT_Countries country0_]
14:20:55.070:调试:选择>>结束[级别= 1,语句=选择]
14:20:55.073:调试:throwQueryException():没有错误
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:调试:throwQueryException():没有错误
14:20:55.255:调试:位于缓存中的 HQL 查询计划(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:调试:结果集行:11
14:20:55.639:调试:返回“AP”作为列:Code1_
14:20:55.639:调试:结果行:EntityKey [Web.DataAccess.ORM.Models.Country#AP]
14:20:55.639:调试:从 DataReader 初始化对象:[Web.DataAccess.ORM.Models.Country#AP]
14:20:55.639:调试:水合实体:[Web.DataAccess.ORM.Models.Country#AP]
14:20:55.639:调试:返回“亚太地区”作为列:Name1_
14:20:55.639:调试:返回“AP”作为列:Alpha3_1_
14:20:55.639:调试:返回“0”作为列:NumericC4_1_
14:20:55.639:调试:结果集行:12
...
14:20:55.701:调试:关闭 IDataReader,打开 IDataReaders:0
14:20:55.702:调试:DataReader 在 290 毫秒后关闭
14:20:55.704:调试:关闭 IDbCommand,打开 IDbCommands:0
14:20:55.707:调试:积极释放数据库连接
14:20:55.707:调试:关闭连接
14:20:55.713:调试:水合对象总数:251
14:20:55.722:调试:解析 [Web.DataAccess.ORM.Models.Country#A1] 的关联
14:20:55.730:调试:将实体添加到二级缓存:[Web.DataAccess.ORM.Models.Country#A1]
14:20:55.736:调试:缓存:Web.DataAccess.ORM.Models.Country#A1
14:20:55.740:调试:找不到区域的根缓存项。
14:20:55.744:调试:为缓存区域创建根缓存条目:CountriesRegion
14:20:55.745:调试:为更改通知登记缓存依赖项
14:20:56.042:调试:将缓存依赖项附加到根缓存条目。检测到更改时将删除缓存条目。
14:20:56.045:调试:添加新数据:key=NHibernate-Cache:CountriesRegion:Web.DataAccess.ORM.Models.Country#A1@-1467239096 & value=NHibernate.Cache.Entry.CacheEntry
14:20:56.047:调试:项目将于 2013 年 7 月 8 日 17:20:56 到期
14:20:56.058:调试:完成实体化 [Web.DataAccess.ORM.Models.Country#A1]
14:20:56.061:调试:解析 [Web.DataAccess.ORM.Models.Country#A2] 的关联
14:20:56.061:调试:将实体添加到二级缓存:[Web.DataAccess.ORM.Models.Country#A2]
14:20:56.061:调试:缓存:Web.DataAccess.ORM.Models.Country#A2
…………
第二次运行,5 秒后产生一个新的 SQL 查询,与第一次相同,这会输出以下许多日志(返回值并在缓存中注册:
15:17:34.076:调试:[session-id=e1feb78d-6c3e-40a4-8b46-6d5742bd0f85] 在时间戳打开会话:5622590071095296,对于会话工厂:[/0ee3e73fbf6741d28adcff632c68b671]
15:17:34.077:调试:表达式(部分评估):值(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:调试:位于缓存中的 HQL 查询计划(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:调试:命名参数:{}
15:17:34.077:调试:打开新的 IDbCommand,打开 IDbCommands:1
15:17:34.077:调试:为 SqlString 构建 IDbCommand 对象:从 LUT_Countries country0_ 中选择 country0_.Code 作为 Code1_,country0_.Name 作为 Name1_,country0_.Alpha3_IsoCode 作为 Alpha3_1_,country0_.NumericCode 作为 NumericC4_1_
15:17:34.077:INFO:从LUT_Countries country0_中选择country0_.Code作为Code1_,country0_.Name作为Name1_,country0_.Alpha3_IsoCode作为Alpha3_1_,country0_.NumericCode作为NumericC4_1_
15:17:34.078:调试:从驱动程序获取 IDbConnection
15:17:34.079:调试:ExecuteReader 花了 1 毫秒
15:17:34.079:调试:打开 IDataReader,打开 IDataReaders:1
15:17:34.079:调试:处理结果集
15:17:34.079:调试:结果集行:0
15:17:34.080:调试:返回“A1”作为列:Code1_
15:17:34.080:调试:结果行:EntityKey [Web.DataAccess.ORM.Models.Country#A1]
15:17:34.080:调试:从 DataReader 初始化对象:[Web.DataAccess.ORM.Models.Country#A1]
15:17:34.080:调试:水合实体:[Web.DataAccess.ORM.Models.Country#A1]
15:17:34.080:调试:返回“匿名代理”作为列:Name1_
15:17:34.080:调试:返回“A1”作为列:Alpha3_1_
15:17:34.080:调试:返回“0”作为列:NumericC4_1_
15:17:34.080:调试:结果集行:1
...