【问题标题】:NHibernate Lookup Table Caching + SqlCacheDependencyNHibernate 查找表缓存 + SqlCacheDependency
【发布时间】:2013-06-28 19:28:27
【问题描述】:

我正在尝试使用 NHibernate 的二级缓存提供程序 SysCache2 和 SqlCacheDependency 为我的查找表配置缓存。

我正在一个国家/地区表上测试我的框架,但阅读 NHibernate 的日志让我明白缓存不起作用..而且我不知道为什么。

我一无所知:/

在数据库和表 LUT_Countries 上启用了 SqlCacheDependency。

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 的 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 : DEBUG : cache for: countriesRegion 使用策略:只读

14:20:53.546 : WARN : 为可变的只读缓存配置:国家地区

14:20:53.551:调试:从配置中构建缓存区域“CountriesRegion”

14:20:53.559 : DEBUG : 配置缓存区域

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 : DEBUG : 实例化会话工厂

14:20:53.817 : INFO : 在区域开始更新时间戳缓存:UpdateTimestampsCache

14:20:53.817:调试:构建未配置的缓存区域:UpdateTimestampsCache

14:20:53.817 : DEBUG : 配置缓存区域

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 : DEBUG : 配置缓存区域

14:20:53.819:调试:没有使用默认值指定优先级:默认值

14:20:53.819:调试:使用默认值:00:05:00 没有指定过期时间

14:20:53.825 : DEBUG : 检查 0 个命名的 HQL 查询

14:20:53.825 : DEBUG : 检查 0 个命名 SQL 查询

14:20:53.868 : DEBUG : [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 : DEBUG : select

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 : DEBUG : processQuery() : ( SELECT ( {select 子句} country0_.Code ) ( FromClause{level=1} 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.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:调试:throwQueryException():没有错误

14:20:55.255 : DEBUG : 位于缓存中的 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 : DEBUG : 关闭 IDataReader,打开 IDataReaders :0

14:20:55.702 : DEBUG : DataReader 在 290 毫秒后关闭

14:20:55.704 : DEBUG : 关闭 IDbCommand,打开 IDbCommands: 0

14:20:55.707 : DEBUG : 积极释放数据库连接

14:20:55.707 : DEBUG : 关闭连接

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 : DEBUG : 为缓存区域创建根缓存条目:CountriesRegion

14:20:55.745 : DEBUG : 为更改通知登记缓存依赖项

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 : DEBUG : [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 : 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:调试:查找:NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country]

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

15:17:34.077 : DEBUG : 打开新的 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 : 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.078:调试:从驱动程序获取 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:调试:返回“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

...

【问题讨论】:

    标签: nhibernate syscache2


    【解决方案1】:

    您应该在事务中运行它并在最后提交事务。

    仅当事务已成功提交时,NHibernate 才会更新二级缓存。如果您不启动 NHibernate 事务,NHibernate 将不知道结果是否足以被缓存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 2012-10-20
      • 2010-12-04
      • 1970-01-01
      • 2017-08-17
      相关资源
      最近更新 更多