问题标签 [ehcache]

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

hibernate - 在 JBoss 上配置 EhCache

好吧,这让我发疯....

服务器:JBoss 4.0.5

我有我的 hibernate-service.xml,其中包括:

就加载和启动 ehcache 而言,这似乎工作正常,但我确实看到了这条令人讨厌的消息:

警告:未找到配置。从类路径中的 ehcache-failsafe.xml 配置 ehcache:jar:file:/C:/jboss-4.0.5.GA/server/default/lib/ehcache-1.6.1.jar!/ehcache-failsafe.xml

最终的应用程序是一个具有以下结构的 ear 文件:

app.har 包含 bean 和 hibernate 映射以及 hibernate-service.xml 和 hibernate.cfg.xml 以及类根目录下的 ehcache.xml。

一切正常,MDB 和 Webapp 工作,但我无法配置 ehcache,我怀疑我没有正确指定配置,或者 ehcache.xml 不在正确的位置。

0 投票
1 回答
1142 浏览

hibernate - Hibernate + EhCache,不断丢失缓存

我已经将我的一些对象配置为可缓存(在映射文件上),并且从我所看到的这个特定对象的情况来看,缓存的工作并不好。

对于其他对象,我看到每次迭代的命中计数都在增加,但错过的计数为 0,而对于这个对象,我看到它每次都错过了会话​​。

我正在寻找一些可能是错误的指针。

  • 作为背景,我检查了 equals 和 hashCode 实现,甚至调试似乎也返回了正确的结果。
  • 此特定对象用于其他对象的集合以及顶级对象的集合中。
0 投票
1 回答
6331 浏览

java - 同一主机上的 2 个实例之间的 ehcache 自动发现(通过多播)

我在同一台主机上运行 2 个 tomcat 实例。每个实例都运行相同的 Web 应用程序,该应用程序尝试通过 RMI 复制与一些 ehcache 缓存进行通信。我在 ehcache 中使用自动发现配置,因此我不必明确定义哪些是主机,哪些是我要复制的缓存。ehcache 实例无法找到彼此并进行通信:

如果我尝试同样的事情,但这次在单独的主机(框)上运行每个 tomcat 实例,那么一切都像一个魅力。

我做错了什么,或者当实例位于同一主机上时,是否可以通过多播进行自动发现?

我的配置使用RMI 分布式缓存文档中提供的默认值:

在我要复制的每个缓存区域内,我有:

谢谢

0 投票
1 回答
4715 浏览

hibernate - 休眠二级缓存不缓存提交的实体

我想知道 Hibernate 二级缓存(我们正在使用 EHCache)是否有可能允许应用程序缓存已提交给数据库的实体,如果它知道没有其他应用程序正在修改数据库。

我的想法是,如果我更新记录 A,那么我知道记录 A 的值并且应该能够缓存它,像 Terracotta 这样的 JVM 集群系统在使用 Java 同步锁的 JVM 堆内存方面支持这种类型的行为。

Hibernate中的EHCache锁模式配置

0 投票
1 回答
5510 浏览

java - 缓存键生成

我正在使用 ehcache(通过 Grails 插件)。将对象添加到缓存的方法要求键是可序列化的,因此典型的用法是:

(布尔参数表示对象应该添加到分布式缓存还是本地缓存)

我的问题是我应该如何从值对象生成键,例如:

一种方法是提供 hashCode() 和 equals() 方法并使用 hashCode 作为键。在这种情况下,我不需要让 Person 类实现 Serializable。

或者,我可以简单地使用 Person 对象本身作为键。似乎我仍然需要提供 equals 和 hashCode 方法,但也需要实现 Serializable。但是,使用这种方法发生冲突的可能性似乎较小,因为 Person 只能等于 Person 的另一个实例。

我假设 ehcache 使用一个键的 equals() 方法来确定该键是否已经存在于缓存中,这个假设是否正确?

上面概述的任何一种方法本质上都比另一种更好,还是我没有考虑过另一种方法?

谢谢,唐

0 投票
2 回答
4504 浏览

java - 如何同步对 ehcache、memcached 和其他键值存储的访问?

据我了解,这些方法中的每一个:get()put()都是原子的。

但是,当访问像 ehcache 和 memcached 这样的缓存时,CheckThenAct会出现竞争条件。

我们应该同步什么以确保如果 thread1 执行 aGet()并且 thread2 执行 aGet()后跟 a Put(),那么第一个Get()将接收到添加的新值thread2

0 投票
3 回答
5222 浏览

java - Hibernate/Ehcache:从 2 级缓存中逐出与其他数据库读取不同步的集合

我有一个使用 JPA、Hibernate 和 ehcache 以及 Spring 的声明性事务的应用程序。DB 上的负载相当高,因此所有内容都被缓存以加快速度,包括集合。现在,集合与拥有它们的实体分开缓存已经不是什么秘密了,所以如果我删除一个作为此类缓存集合的元素的实体,持久化一个应该是一个元素的实体,或者更新一个实体,使其从一个集合移动到另一个集合,我必须手动执行驱逐。

所以我使用了一个休眠事件监听器,它跟踪被插入、删除或更新的实体,并保存该信息以供在 Spring 的事务管理器中注册的事务同步进行操作。一旦提交事务,同步就会执行驱逐。

现在的问题是,其他一些并发事务经常设法在缓存中找到一个刚刚被驱逐的集合(根据日志,这些事件通常相隔十分之一秒),并且自然会导致 EntityNotFoundException 发生。

如何正确同步这些东西?

我尝试在 TransactionSynchronization 的 4 种方法中的每一种中进行驱逐(在相对于事务完成的不同时间点调用),但没有帮助。

0 投票
1 回答
1976 浏览

scala - 覆盖在 Scala 中实现的 JavaBeans 的 equals 和 hashCode 方法

我正在使用 iBatis 和 Java 缓存工具 ehcache 开发一个项目,但我正在 Scala 中实现模型类。我有一种强烈的感觉,我必须重写 equals 和 hashCode 方法以使缓存能够轻松管理其上的对象。

由于 scala 类中的大多数必需属性都是 vars,因此我需要有关创建依赖于 vars 和有效的对象比较的有效等于定义的建议。

代码示例将不胜感激。

谢谢。

0 投票
1 回答
1138 浏览

java - 在休眠中使用 ehcache 阻塞装饰器

我将 ehcache 与 hibernate 一起使用,我想使用阻塞或 SelfPopulating 缓存来避免出现的问题http://ehcache.org/documentation/constructs-0_5.html#mozTocId722946

需要一个昂贵的操作,比如渲染一个大的网页,这需要 30 秒。该页面在 5 分钟之前不会被认为是陈旧的。该页面受到的打击非常大,平均每 5 分钟会被打击 20 次。

我是否必须以编程方式执行此操作http://ehcache.org/documentation/cache_decorators.html建议或者是否有一种声明性(在 xml 中)的方式来做到这一点?

多谢

0 投票
2 回答
5365 浏览

java - 避免同一缓存区域的多次重新填充(由于并发性)

我有一个高流量的网站,我使用休眠。我还使用 ehcache 来缓存生成页面所需的一些实体和查询。

问题是“并行缓存未命中”,长的解​​释是,当应用程序启动并且缓存区域很冷时,每个缓存区域被不同的线程多次填充(而不是一次),因为该站点被许多用户访问同时。此外,当某些缓存区域失效时,由于相同的原因,它会被多次重新填充。我怎样才能避免这种情况?

通过向 hibernate.cache.provider_class 提供我自己的实现,我设法将 1 个实体和 1 个查询缓存转换为 BlockingCache,但 BlockingCache 的语义似乎不起作用。更糟糕的是,有时 BlockingCache 死锁(块)并且应用程序完全挂起。线程转储显示在执行 get 操作时 BlockingCache 的互斥体上的处理被阻塞。

那么,问题来了,Hibernate 支持这种使用方式吗?

如果没有,您如何在生产中解决这个问题?

编辑hibernate.cache.provider_class指向我的自定义缓存提供程序,它是来自SingletonEhCacheProvider的复制粘贴,并且在 start() 方法的末尾(在第 136 行之后)我这样做:

这样在初始化时,在其他人接触名为“foo”的缓存之前,我用 BlockingCache 装饰它。“foo”是查询缓存,“bar”(相同的代码但省略)是 pojo 的实体缓存。

编辑2:“似乎不起作用”意味着最初的问题仍然存在。由于并发性,缓存“foo”仍然被多次重新填充相同的数据。我通过使用具有 10 个线程的 JMeter 向站点施加压力来验证这一点。我希望这 9 个线程阻塞,直到第一个从“foo”请求数据以完成它的工作(执行查询,将数据存储在缓存中),然后直接从缓存中获取数据。

编辑 3:这个问题的另一种解释可以在https://forum.hibernate.org/viewtopic.php?f=1&t=964391&start=0但没有明确的答案。