【问题标题】:Fluent NHibernate Syscache2 cache expirationFluent NHibernate Syscache2 缓存过期
【发布时间】:2012-07-30 22:32:11
【问题描述】:

我一直在开发使用 fluent 和 syscache2 的 WCF 服务。关于我目前的困境,我几乎阅读了所有关于 SO 的文章;我没有运气。

我正在尝试为我的二级缓存设置过期时间。我设置的任何值似乎都被忽略了,默认值 5 分钟用于使缓存过期。

流畅的配置:

注意:contextClass 只是一个描述符类,保存传递给配置的值。

var cfg = Fluently.Configure()
                .Database(
                    MsSqlConfiguration.MsSql2008                        
                    .ConnectionString(c => c.Is(connectionString))
                    .ShowSql()
                    )
                .Diagnostics(d => d.Enable())                                                             
                .Cache(c => c                                 
                            .UseQueryCache()          
                            .ProviderClass(typeof(NHibernate.Caches.SysCache2.SysCacheProvider).AssemblyQualifiedName))                    
                .Mappings(m => m
                    .FluentMappings
                    .AddFromAssembly(assembly)) 
                .ExposeConfiguration(x =>
                {
                    x.SetProperty(NHibernate.Cfg.Environment.CurrentSessionContextClass, contextClass.Id);
                    x.SetProperty(NHibernate.Cfg.Environment.PrepareSql, contextClass.PrepareSql); //set prepare_sql true/false
                    x.SetProperty(NHibernate.Cfg.Environment.CacheDefaultExpiration, contextClass.ExpireL2Cache); //set default expiration in seconds
                });

我还设置了 app.config 文件,如下所示:

<configSections>
  <section name="syscache" type="NHibernate.Caches.SysCache2.SysCacheSection, NHibernate.Caches.SysCache2"/>
</configSections>

<syscache>
  <cache expiration="600" priority="5" />
</syscache>

app.config 有一个变体,它有一个使用区域的 syscache 部分,但也不起作用。

有人对想法有什么建议吗?

谢谢

【问题讨论】:

    标签: nhibernate caching fluent-nhibernate syscache2


    【解决方案1】:

    我一直使用这个没有问题:

    .ExposeConfiguration (cfg => {
        cfg.Properties.Add ("expiration", "900");
    })
    

    不确定 Properties.Add 的行为是否与您正在使用的 SetProperty 调用有任何不同。

    如果您使用的是较新版本的 NHibernate,您似乎也可以依赖 NHibernate.Cfg 命名空间中的新扩展方法(这将替换整个 .Cache 流利调用)

    .ExposeConfiguration (cfg => {
        cfg.SessionFactory().Caching.Through<SysCacheProvider>().WithDefaultExpiration(900);
    })
    

    阅读我发现this:

    cache.default_expiration 或 expire (Int32):因为 NH Contrib 2.1 cache.default_expiration 是新的设置名称,应该使用它来代替 expire 来指定缓存项必须失效的秒数。默认值为 300 秒。仍然支持旧名称以实现向后兼容性。

    所以属性名称可能不是您的问题(现在想知道我使用的“过期”键是否也可能特定于内存缓存提供程序,尽管它似乎适用于 syscache)。

    【讨论】:

    • SetProperty 等价于写 Properties["keyName"]。当我查看 Environment 类时,我能够找到以下内容:` public const string CacheDefaultExpiration = "cache.default_expiration"; ` 我试着做你提到的流利配置。但是,我无法在设置时访问配置中的会话工厂。该代码目前使用 NH 3.2.0.400 和 fNH 1.3.0.717
    • 嗯,也许那是更新的,虽然我认为它会在 3.0+ 中可用。你确定你引用的是 NHibernate.Cfg 命名空间吗?如果没有,您将无法访问配置之外的扩展方法。
    • 我想我成功了。不过我不确定......你的小费肯定有帮助......因为事实证明 NHibernate.Cfg 命名空间丢失了。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多