问题标签 [second-level-cache]

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 回答
282 浏览

nhibernate - NHibernate 父子关系:NH 是否更新实体缓存中的父级?

如果我更新父子关系中的孩子,则孩子会在 L2 缓存中更新。但是父母呢?是否可以在不访问数据库的情况下做到这一点?

谢谢!

0 投票
1 回答
764 浏览

hibernate - Hibernate 二级缓存和关联

我的班级 Movie 与 Director 具有 @OneToOne 关系,与 Actor 具有 @ManyToMany 关系。所有这些类(电影、导演和演员)类都以只读模式缓存,集合也是如此。

我将 Hibernate 的二级缓存与 ehCache 一起使用。

这些关系是 LAZY 的,所以我有以下问题:如果电影在没有调用 getDirector() 或 getActors() 的情况下进入二级缓存,如果随后在没有 Session.merge() 的情况下调用这些方法,我们将得到一个 LazyInitializationException,这不是我的选择。

我想如果我可以挂钩事件“放入缓存”并调用我的惰性方法,我的问题就会得到解决。有这样的事吗?我不愿意编写自定义基础架构代码,因为二级缓存会根据应用程序等打开/关闭。

我还缺少其他东西吗?

谢谢。

0 投票
2 回答
412 浏览

nhibernate - NHibernate - 具有并发和二级缓存的计数器

我是 NHibernate 的新手,在为我当前的网站设置它时遇到了困难。该网站将在具有一台数据库服务器的多个网络服务器上运行,这让我面临一些并发问题。该网站将有大约 50.000 名注册用户,每个用户都有一个个人资料页面。在这个页面上,其他用户可以“喜欢”另一个用户,就像 Facebook 一样。这是并发问题的开始。

我正在考虑使用二级缓存,很可能使用 MemChached 提供程序,因为我将拥有多个网络服务器。使用 NHibernate 实现这种“喜欢”功能的最佳方法是什么?我在考虑三个选项:

  1. 使用简单的 Count() 查询。将有一个表'User_Likes',其中每一行代表一个用户对另一个用户的喜欢。要显示喜欢的数量,我会简单地询问用户的喜欢数量,这将被翻译成简单的数据库SELECT COUNT(*) FROM USER_LIKES WHERE ID = x。但是,我认为这会带来很大的性能损失,因为每次用户访问个人资料页面并且喜欢另一个用户时,都必须重新计算喜欢的数量,无论是否二级缓存。
  2. 在用户表中使用附加NumberOfLikes列并在用户喜欢或不喜欢另一个用户时增加/减少此值。然而,这给了我并发问题。使用一个简单的 for 循环,我通过在两台服务器上喜欢一个用户 1000 次来测试它,数据库中的结果总共大约 1100 个喜欢。那是900的差异。无论是不是现实测试,这当然不是一个选择。现在,我将乐观和悲观锁定视为一种解决方案(是吗?)但我目前的存储库模式恐怕不适合使用它,所以在我修复它之前,我想知道如果这是正确的方法。
  3. 像 2,但使用自定义 HQL 并自己编写更新语句,类似于UPDATE User SET NumberOfLikes = NumberOfLikes + 1 WHERE id = x. 这不会给我数据库中的任何并发问题,对吗?但是,由于二级缓存,我不确定我的多台服务器上是否会有任何数据不匹配。

所以......我真的需要一些建议。还有其他选择吗?这感觉像是一种常见的情况,当然 NHibernate 必须以一种优雅的方式支持这一点。我是 NHIbernate 的新手,所以一个清晰、详细的回复是必要的和感激的 :-) 谢谢!

0 投票
1 回答
2124 浏览

nhibernate - 为什么 NHibernate.Cache.HashtableCacheProvider 不适合生产使用?

NHibernate 文档NHibernate In Action一书声明缓存提供程序NHibernate.Cache.HashtableCacheProvider不适合生产使用。但是,我找不到这样做的原因。有谁知道原因?

0 投票
1 回答
393 浏览

nhibernate - nHibernate 急切加载 - 奇怪的更新行为

我的域是一个机场,其中包含多个航站楼,每个航站楼都包含区域等。
由于机场/航站楼/区域实体的数量非常少,我想:
1.在检索机场时急切地加载所有层次结构。
(使用以下流畅的配置:

)
2. 启用二级缓存,以便机场对象的所有检索都不会命中数据库。

急切加载和缓存工作正常,但以下测试会产生一些奇怪的行为。
(以下代码两次检索一个机场实体(第二次没有访问数据库),并更新其中一个。)

查看结果输出:

首先选择
NHibernate: SELECT airport0_.Id as Id36_0_, airport0_.Name as Name36_0_, airport0_.IsDeleted as IsDeleted36_0_ FROM dbo.[Airport] airport0_ WHERE airport0_.Id=@p0;@p0 = 1

NHibernate: SELECT terminal0_.Airport_id as Airport4_1_, terminal0_.Id 作为 Id1_,terminal0_.Id 作为 Id50_0_,terminal0_.Name 作为 Name50_0_,terminal0_.IsDeleted 作为 IsDeleted50_0_,terminal0_.Airport_id 作为 Airport4_50_0_ FROM dbo.[Terminal] terminal0_ WHERE terminal0_.Airport_id=@p0;@p0 = 1

NHibernate:选择 zone0_.Terminal_id 作为 Terminal4_1_,zone0_.Id 作为 Id1_,zones0_.Id 作为 Id51_0_,zones0_.Name 作为 Name51_0_,zones0_.IsDeleted 作为 IsDeleted51_0_,zones0_.Terminal_id 作为 Terminal4_51_0_ FROM dbo.[Zone] zone0_ WHERE zone0_.Terminal_id=@p0 ;@p0 = 2


秒选择
这些是同一个机场实例吗?False

现在添加一个终端
NHibernate: select next_hi from dbo._uniqueKey with (updlock, rowlock)
NHibernate: update dbo._uniqueKey set next_hi = @p0 where next_hi = @p1;@p0 = 17, @p1 = 16

NHibernate: INSERT INTO dbo .[Terminal] (Name, IsDeleted, Airport_id, Id) VALUES (@p0, @p1, @p2, @p3);@p0 = '终端添加到第二个机场', @p1 = False, @p2 = NULL, @ p3 = 16
NHibernate: UPDATE dbo.[Airport] SET Name = @p0, IsDeleted = @p1 WHERE Id = @p2;@p0 = 'test airport', @p1 = False, @p2 = 1

NHibernate: UPDATE dbo.[ Terminal] SET Name = @p0, IsDeleted = @p1, Airport_id = @p2 WHERE Id = @p3;@p0 = '测试终端', @p1 = False, @p2 = 1, @p3 = 2

NHibernate: UPDATE dbo.[Zone] SET Name = @p0, IsDeleted = @p1, Terminal_id = @p2 WHERE Id = @p3;@p0 = '测试区', @p1 = False, @p2 = 2, @p3 = 3

NHibernate: UPDATE dbo.[Terminal] SET Airport_id = @p0 WHERE Id = @p1;@p0 = 1, @p1 = 16



我的问题是:
1. 更新所有内容的奇怪更新行为......
2. firstAirport 和 secondAirport 不是同一个对象的事实(也许我错过了关于二级缓存的一些东西?)

提前谢谢,
Jhonny

0 投票
1 回答
238 浏览

hibernate - 二级缓存是否支持缓存查询结果排除实体

普通查询方式:

在这种情况下,列表中的对象是“实体”。它们将被缓存。

但是我想知道如果 hql 是这样的,缓存是否会起作用:

现在,结果列表中对象的类型将是Result

我的问题是Result Object 是否可以保存在二级缓存中?

还有ResultTransformer怎么样?

在这种情况下, q.list() 中的对象类型将是Map,这些地图也可以缓存吗?

0 投票
2 回答
8145 浏览

java - 问题:软锁定缓存条目已被底层 Ehcache 过期

我收到以下警告,但我不知道该怎么做。每次更新禁用 IP 时,大约有 80000 个条目将此警告写入 tomcat 中的 catalina.out 日志文件:

ehcache.xml 文件中 BannedIP 的配置:

任何帮助将不胜感激。

0 投票
1 回答
1715 浏览

java - 确定二级缓存是否在休眠状态下工作的问题

我正在尝试在我的项目中使用 ehcache.. 我在休眠配置文件中指定了以下属性 -

config.setProperty("hibernate.cache.provider_class","org.hibernate.cache.EhCacheProvider"); config.setProperty("hibernate.cache.provider_configuration_file_resource_path","ehcache.xml"); config.setProperty("hibernate.cache.use_second_level_cache","true"); config.setProperty("hibernate.cache.use_query_cache","true");

现在我仍然不确定结果是来自数据库还是缓存..

我环顾四周,发现 - Hibernate 二级缓存 - 打印结果 ,该人建议使用 HitCount/Misscount API

但是,当我尝试使用它时,命中计数和未命中计数总是返回 0 ...这是我的代码

String rName = "org.hibernate.cache.UpdateTimestampsCache"; 统计 stat = HibernateHelper.getInstance().getFactory().getStatistics(); long oldMissCount = stat.getSecondLevelCacheStatistics(rName).getMissCount(); long oldHitCount = stat.getSecondLevelCacheStatistics(rName).getHitCount(); UserDAO user = new UserDAO(); user.read(new Long(1)); long newMissCount = stat.getSecondLevelCacheStatistics(rName).getMissCount(); long newHitCount = stat.getSecondLevelCacheStatistics(rName).getHitCount();

if(oldHitCount+1 == newHitCount && oldMissCount+1 == newMissCount) { System.out.println("来自数据库"); } else if(oldHitCount+1 == newHitCount && oldMissCount == newMissCount) {
System.out.println("来自缓存"); }

如果我用错了,请告诉我.. 在这种情况下,rName(region Name) 应该是什么..

有没有其他方法可以确定二级缓存是否工作?

谢谢

0 投票
2 回答
404 浏览

hibernate - 并发创建事件

我将 JBoss 5.1.0 GA 与 Hibernate 一起使用,现在我正在尝试启用二级缓存。我已将以下属性添加到我的 Hibernate 配置中。

我已经注释了我希望不经常更改的实体,如下所示:

这是基于我对文档的理解。

应用程序成功部署,没有可怕的消息(例如日志流中的 WARN 或 ERROR 消息)。在很短的时间内,我看到缓存工作(我正在使用 Hibernate 统计信息来查看这一点),但不久之后,我得到了表单的堆栈跟踪(即使以没有任何远程访问权限的单个用户身份登录):

“事务试图重新创建 MYCLASS。自此事务开始以来,它已经由另一个(可能是远程)事务创建。我们有一个并发创建事件”

接下来是一个巨大的堆栈跟踪,最终追溯到我所做的一个命名查询,它具有以下形式:

命名查询没有用于缓存的附加注释。

任何有关如何解决此问题的建议将不胜感激。

0 投票
3 回答
1072 浏览

nhibernate - AppFabric 缓存的本地缓存对我们不起作用......我们做错了什么?

我们使用 appfabric 作为 NHibernate asp.net 应用程序的二级缓存,该应用程序包括面向客户的网站和管理网站。它们都连接到同一个缓存,因此当管理员更新某些内容时,面向客户的站点也会更新。

它似乎工作正常 - 我们在单独的服务器上有一个 CacheCLuster,一切都很好,但我们希望启用 localcache 以获得更好的性能,但是,它似乎没有工作。

我们已经像这样启用它...

最初我们尝试使用超时失效策略(3 分钟),我们的应用感觉运行得更快了。但是,我们注意到,如果我们在管理站点中更改某些内容,它会立即在实时站点中更新。由于我们使用的是超时而不是通知,这表明本地缓存没有被查询(或者是,但总是丢失)。

cache.GetType().Name 返回“LocalCache” - 所以工厂已经做了一个本地缓存。

在我的开发环境中的 PS 中运行“Get-Cache-Statistics MyCache”(从 vs2008 本地运行的 asp.net 应用程序,在单独的 w2k8 机器上运行的缓存集群)显示了一些请求计数。但是,在生产环境中,请求计数会急剧增加。

我们尝试按照此处的方法来设置缓存客户端服务器流量... http://blogs.msdn.com/b/appfabriccat/archive/2010/09/20/appfabric-cache-peeking-into-client-amp -server-wcf-communication.aspx 但日志文件中只有初始标头 - 即也没有登录。

我在 SO 或 Google 中找不到任何东西。

我们做错了什么吗?我们是否安装了 AppFabric - 我们通过 WebPlatform Installer 安装了它 - 我想?(注意:运行 ASp.net 的 IIS 框不在集群中 - 它只是客户端)。

任何见解都非常受欢迎!