问题标签 [syscache2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1306 浏览

c# - NHibernate SysCache2 和查询缓存 - 无法避免 Select N+1?

我正在使用具有 Fluent NHibernate 的二级缓存提供程序 SysCache2,使用标准的 fluent 配置(启用查询缓存,这似乎是一般建议),并以通常的方式定义了基于表的依赖项。

流利:

)

网络配置:

用户映射:

对于单个请求,一切都按预期运行,即:

正如NHibernate 按 ID 缓存的方式所预期的那样。后续请求不会命中数据库,而使数据库中的记录失效会导致Entity失效,从而导致在下一次请求期间进行后续SQL调用。一切都好。

问题在于查询缓存。首先,一切正常。执行调用,例如:

如您所料那样导致 SQL 调用(SELECT * FROM Users WHERE Active = true)。随后的执行不会导致 SQL。伟大的。直到查询集中的一条记录在数据库中发生更改。执行相同的查询会产生一个 SELECT N+1:

我在其他地方找到了对此的参考,尽管没有解决方案:

StackOverflow - 如何使 NHibernate 缓存获取子集合?请参阅“多一点”部分

Ayende Caching Strategies他提到确保最后“实体也被缓存”

目前我可以避免这种情况的唯一方法是在每次请求后清除查询缓存——这几乎使它无用。当某个实体无效时,我需要查询缓存来清除该实体的所有内容——而不仅仅是单个记录。

有任何想法吗?

0 投票
1 回答
1070 浏览

asp.net - SessionFactory.Evict 的副作用?

每隔一段时间,我的任务就是对数据库中可能已经缓存在内部应用程序中的一个或多个业务实体进行更改。为了让应用程序在不循环应用程序池的情况下反映这些更改,我想我应该嵌入开发/管理员从应用程序 UI 中逐出缓存的功能(完全或某些对象),但我注意到了该方法说明以下...

这到底是什么意思呢?如果我试图驱逐一个或多个交易中可能涉及的对象,可能会出现什么问题,如果它们具有破坏性,是否有办法避免这些副作用?我目前正在使用 SysCache2 并正在寻找有关如何使用 SqlDependency 的实现细节,但同时我仍然对 Evict 效果感到好奇。

更新:仔细查看评论后,似乎从进程级缓存中删除,并SessionFactory.Evict()从二级缓存中删除。然而,这两种口味都存在相同的免责声明。所以我原来的问题仍然存在。如果实体当前正在另一个事务中使用,那么从缓存(进程或二级)中逐出实体有什么危险?SessionFactory.EvictCollection()SessionFactory.EvictEntity()

0 投票
2 回答
1195 浏览

nhibernate - nhibernate L2缓存:通过代码配置

如何在代码中配置二级缓存(不是通过 xml)

我目前的设置是:

0 投票
1 回答
111 浏览

nhibernate - 在 MVC 应用程序中从 NHibernate 缓存用户角色

使用这样的类...

还有一个看起来像这样的ERD...... 数据模型 ERD

这是我当前的查询。

问题是,虽然对我网站的第一个请求总是很好,并且作为对当前用户角色的单个查询进行,但后续请求会导致 NHibernate Profiler 显示大量缓存查询(每个角色一个)。我不完全确定这是否是一个危险信号(我正在使用 SysCache2,但它目前没有使用数据库依赖项)。但我想尝试找到一种方法来清除它。

有没有办法解决这个问题,这样当第一个请求只是一个数据库命中时,我不会在每个请求上获得每个角色的缓存命中?或者作为一个类比,我是否将管道上的冷凝误解为泄漏?

0 投票
1 回答
618 浏览

nhibernate - How to configure syscache's Region and Expiration using code (not in App.Config xml)

I'm trying to configure NHibernate's 2nd level cache. I want to configure by code and not use xml configuration I've followed most of the tutorial but I can't seem to translate this xml configuration in code:

How can I configure the syscache region and expiration settings using code?

0 投票
1 回答
926 浏览

nhibernate - NHibernate 查找表缓存 + SqlCacheDependency

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

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

我一无所知:/

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

网络配置:

流畅的配置:

NHibernate 的 Country Fluent 映射:

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

...

0 投票
1 回答
507 浏览

c# - NHibernate SysCache2 - 依赖关系中断缓存

公司等级:

公司表:

这是我的 web.config:

问题:RefData 缓存区域中的其他实体(永远不会改变,认为国家等)被缓存得很好。另一方面,公司不是。