NHibernate查找表缓存+ SqlCacheDependency

时间:2013-07-01 15:43:51

标签: nhibernate syscache2

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

我在一个Country表上测试我的框架,但阅读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的国家流利地图:

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:为mutable配置的只读缓存:CountriesRegion

14:20:53.551:DEBUG:从配置构建缓存区域&#39; CountriesRegion&#39;,

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表依赖,&#39;国家&#39;使用表格,&#39; LUT_Countries&#39;和数据库条目。 &#39;默认&#39;

...

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:DEBUG:没有使用默认值指定优先级:默认

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:检查0个命名的SQL查询

14:20:53.868:DEBUG:[session-id = 76cd9097-abc6-49f4-9fcb-2f5a0ca446ae]在时间戳打开会话:5622576143695872,对于会话工厂:[/ 311e0b6b7e7a41b289b4347267f963f9]

14:20:54.169:DEBUG:表达式(部分评估):value(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:select&lt;&lt;开始[level = 1,statement = select]

14:20:54.957:​​DEBUG:FromClause {level = 1}:Web.DataAccess.ORM.Models.Country( 0) - &gt; country0

14:20:54.992:DEBUG:已解决: 0 - &gt; country0 。代码

14:20:55.000:DEBUG:选择:完成[level = 1,statement = select]

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

14:20:55.065:DEBUG:使用FROM片段[LUT_Countries country0 _]

14:20:55.070:DEBUG:选择&gt;&gt;结束[level = 1,statement = select]

14:20:55.073:DEBUG:throwQueryException():没有错误

14:20:55.199:DEBUG:SQL:选择country0_.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.Country])

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

...

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

14:20:55.639:DEBUG:回归&#39; AP&#39;作为列: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:DEBUG:保湿实体:[Web.DataAccess.ORM.Models.Country #AP]

14:20:55.639:调查:返回亚太地区&#39;作为列:Name1 _

14:20:55.639:DEBUG:回归&#39; AP&#39;列:Alpha3_1 _

14:20:55.639:调试:回归&#39; 0&#39;作为列:NumericC4_1 _

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

...

14:20:55.701:DEBUG:关闭IDataReader,打开IDataReaders:0

14:20:55.702:DEBUG:DataReader在290 ms后关闭

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

14:20:55.707:DEBUG:积极发布数据库连接

14:20:55.707:调试:关闭连接

14:20:55.713:调试:水合物总量: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#A1@-1467239096&amp;值= NHibernate.Cache.Entry.CacheEntry

14:20:56.047:DEBUG:item将于:07/08/2013 17:20:56过期

14:20:56.058:DEBUG:完成实体化实体[Web.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:缓存:Web.DataAccess.ORM.Models.Country#A2

... ..


第二次运行,结果是新的SQL查询后5秒,与第一次相同, 这会输出以下许多日志(返回值并在缓存中注册:


15:17:34.076:DEBUG:[session-id = e1feb78d-6c3e-40a4-8b46-6d5742bd0f85]在时间戳打开会话:5622590071095296,对于会话工厂:[/ 0ee3e73fbf6741d28adcff632c68b671]

15:17:34.077:DEBUG:表达式(部分评估):value(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:find: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_来自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:DEBUG:结果集行:0

15:17:34.080:调试:回归&#39; A1&#39;作为列: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:返回&#39; Anonymous Proxy&#39;作为列:Name1 _

15:17:34.080:调试:回归&#39; A1&#39;列:Alpha3_1 _

15:17:34.080:DEBUG:返回&#39; 0&#39;作为列:NumericC4_1 _

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

...

1 个答案:

答案 0 :(得分:0)

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

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