Tag: ehcache

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

我有一个高流量的网站,我使用hibernate。 我还使用ehcache来缓存生成页面所需的一些实体和查询。 问题是“并行缓存未命中”,长期解释是,当应用程序启动并且缓存区域很冷时,每个缓存区域被不同的线程多次填充(而不是仅一次),因为该站点被许多用户击中同时。 此外,当某些缓存区域无效时,由于相同的原因,它会被重新填充多次。 我怎么能避免这个? 我设法通过向hibernate.cache.provider_class提供我自己的实现, 将1个实体和1个查询缓存转换为BlockingCache ,但BlockingCache的语义似乎不起作用。 甚至有时甚至最糟糕的是BlockingCache死锁(块)并且应用程序完全挂起。 线程转储显示在get操作上阻止BlockingCache的互斥锁处理。 那么,问题是,Hibernate是否支持这种用途? 如果没有,你如何在生产中解决这个问题? 编辑 : hibernate.cache.provider_class指向我的自定义缓存提供程序,它是SingletonEhCacheProvider的复制粘贴和start()方法的结尾(在第136行之后)我这样做: Ehcache cache = manager.getEhcache(“foo”); if (!(cache instanceof BlockingCache)) { manager.replaceCacheWithDecoratedCache(cache, new BlockingCache(cache)); } 这样在初始化时,在其他人触摸名为“foo”的缓存之前,我用BlockingCache来装饰它。 “foo”是查询缓存,“bar”(相同的代码但省略)是pojo的实体缓存。 编辑2 :“似乎不起作用”意味着最初的问题仍然存在。 由于并发性,缓存“foo”仍然使用相同的数据重新填充多次。 我通过使用10个线程的JMeter强调网站来validation这一点。 我希望9个线程阻塞,直到第一个请求“foo”数据完成它的工作(执行查询,在缓存中存储数据),然后直接从缓存中获取数据。 编辑3 :这个问题的另一个解释可以在https://forum.hibernate.org/viewtopic.php?f=1&t=964391&start=0看到,但没有明确的答案。

Spring Boot,使用EhCache进行缓存

我需要在我的应用程序中缓存一些数据,我正在考虑使用Ehcache。 我有几个问题: 我需要另一台Ehcache服务器吗? 我是否需要其他客户与Ehcache合作? Ehcache如何处理多个实例? 甚至可以使用Ehcache创建共享缓存之类的东西吗?

基于日期的ehcache

我正在使用ehcache 2.5.4。 我有一个对象需要在白天缓存,并在每天00:00 am刷新一个新值。 目前使用ehcache配置我只能设置生存时间和空闲时间,但这取决于我创建对象的时间或使用时间。 即: 有没有办法让ehcache根据特定时间使特定缓存过期。

寻找java.util.Map的替代品

问题 关注这个问题 ,似乎基于文件或磁盘的Map实现可能是我在那里提到的问题的正确解决方案。 简洁版本: 现在,我有一个实现为ConcurrentHashMap的Map 。 条目以相当固定的速率不断添加到其中。 稍后详细说明。 最终,无论如何,这意味着JVM耗尽了堆空间。 在工作中,(强烈)建议我使用SQLite解决此问题,但在询问上一个问题之后,我认为数据库不是这项工作的正确工具。 所以 – 让我知道这听起来有多疯狂 – 我认为更好的解决方案是存储在磁盘上的Map 。 不好的主意:自己实现这个。 更好的主意:使用别人的图书馆! 哪一个? 要求 必备: 自由。 持久性。 数据需要在JVM重启之间保持不变。 某种可搜索性。 是的,我需要能够检索这些数据以及将其丢弃。 基本结果集过滤是一个加号。 与平台无关。 需要在Windows或Linux计算机上进行生产部署。 可以清除 。 磁盘空间是有限的,就像堆空间一样。 我需要摆脱n天的条目。 如果我必须手动执行此操作,这不是什么大问题。 尼斯对富人: 使用方便。 如果我能在本周末完成这项工作,那将是很棒的。 更好的是:一天结束。 如果我可以在我的类路径中添加一个JAR,更改new ConcurrentHashMap();那真的非常非常棒new ConcurrentHashMap(); 到new SomeDiskStoredMap(); 并完成。 体面的可扩展性和性能。 最坏的情况:新的条目(平均)每秒增加3次,每秒,每天,每天。 但是,插入并不总是顺利发生。 它可能是(no inserts for an hour)然后(insert 10,000 objects at […]

如何在不使用查询缓存的情况下缓存Spring Data JPA查询方法的结果?

我有一个带有Spring Data JPA(hibernate后端)存储库类的Spring Boot应用程序。 我添加了一些自定义查找器方法,其中一些使用特定的@Query注释来告诉它如何获取数据。 我已经为hibernate二级缓存设置了EhCache,但到目前为止,我可以获得这些结果缓存的唯一方法是启用hibernate查询缓存。 我更喜欢定义一个特定的缓存并将实际的域对象存储在那里,就像它是一个普通的查找程序一样。 以下是我的回购代码: public interface PromotionServiceXrefRepository extends PagingAndSortingRepository { @Query(“SELECT psx FROM Customer c ” + “JOIN c.customerProductPromotions cpp ” + “JOIN cpp.productPromotion pp ” + “JOIN pp.promotion p JOIN p.promotionServiceXrefs psx ” + “WHERE c.customerId = ?1”) @QueryHints(@QueryHint(name = “org.hibernate.cacheable”, value = “true”)) @Cache(usage = CacheConcurrencyStrategy.READ_ONLY, region = “promotionServiceXrefByCustomerId”) […]

引起:java.lang.NoClassDefFoundError:当tomcat / lib下存在类时?

我有两场战争都使用一个特定的jar( ehcache-core.jar )。 我把jar放在\lib 。 但是当我启动服务器时,我的应用程序会抛出错误,其中class存在于ehcache-core.jar Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.cache.interceptor.CacheInterceptor#0’: Cannot resolve reference to bean ‘cacheManager’ while setting bean property ‘cacheManager’; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘cacheManager’ defined in URL [jar:file:/F:/codeBase_all/codeBase_Custom/applications/customer-portal/target/customer-webapp-public-1.0-Snapshot/WEB-INF/lib/co-common-1.0-Snapshot.jar!/META-INF/cgi-spring/utils/util-services-bean.xml]: Cannot resolve reference to bean ‘ehcache’ while setting bean property […]

使用Spring / EHCache加载时刷新缓存

我在SpringmultithreadingWeb服务上有一个缓存问题,它带有数据库后端和基于EHCache的缓存。 该服务有许多客户端一次又一次地请求相同的对象,每秒有几十个请求。 经常请求的对象只有几个,并且不经常请求大量其他对象。 对象每隔几分钟就可以更改一次,因此缓存的TTL设置为一分钟。 从数据库加载对象很慢,至少需要几秒钟。 起初我使用了一个天真的实现来获取对象: 检查对象是否在缓存中。 如果是,请从缓存中返回。 如果没有,从数据库加载它,将其放入缓存并返回它。 这在最初在本地测试时运行良好。 但是,每当一个更频繁请求的对象在缓存中到期时,在更快的服务器上进行性能测试就会显示一些非常糟糕的负载峰值。 发生这种情况时,在接下来的10秒内,对该对象的所有请求都将导致数据库加载,直到第一个线程完成数据库加载并将新对象放入缓存。 结果是数据库上的负载很短但非常高,并且许多用户需要等待请求完成。 我当前的实现通过跟踪当前正在加载哪个对象来改进数据库负载: 检查对象是否被缓存。 如果是,请从缓存中返回。 如果没有,请检查当前是否正在加载对象。 如果是,请等待另一个线程的加载完成,从缓存中获取新对象并返回它。 如果不是,则将对象放入加载对象列表中,完成后将其放入缓存中并返回。 通过此实现,即使对象到期,也只有一个数据库操作。 而且,由于数据库负载较低,它也会更快完成。 但它仍然意味着在对象加载期间请求对象的所有用户都需要等待。 我真正想要的是只有第一个线程等待数据库加载,而所有其他线程只是在加载对象时返回’过期’对象。 对于我来说,响应时间比对象太老了几秒钟更重要。 或者,当我注意到对象将在几秒钟内过期时,我可以异步刷新缓存。 这更接近EHCache的单个TTL模型,并且意味着没有人需要等待数据库负载 我真正的问题是:在我重新发明轮子之前,是否有任何现有的框架已经实现了这样的东西(在Spring / EHCache环境中)? 或者也许在Spring / EHCache的某处已经存在对此的支持,我找不到合适的选项?

可以同时安全地访问ehcache diskstore吗?

我看到DiskStore位置有一个.lock文件。 我一直都明白,使文件IOprimefaces化是困难的,有时甚至是不可能的。 所以,我的期望是多个应用程序无法安全地使用相同的ehcache DiskStore。 但是,锁文件让我很奇怪。 除了性能瓶颈,它可以工作吗? 上下文:我想知道运行相同应用程序的两个Java Servlet上下文是否可以共享DiskStore。

EhCache Hibernate二级缓存maxBytesLocalHeap缓慢

我在Spring驱动的应用程序中使用Hibernate(4.2.15.Final)和EhCache(2.6.9)作为二级缓存设置了一个非常标准的持久层设置。 一切都按预期工作。 但是,将条目放入二级缓存有时需要很长时间。 我已经在一个显式的ehcache.xml文件中配置了我的域模型类的缓存(我没有配置默认缓存): … 我在持久化上下文启动时记录了以下INFO消息: DefaultSizeOfEngine | using Agent sizeof engine 以及执行期间的以下警告 ObjectGraphWalker | The configured limit of 1,000 object references was reached while attempting to calculate the size of the object graph. Severe performance degradation could occur if the sizing operation continues. […] AFAIK ObjectGraphWalker必须调整放入缓存的实体的大小,因为我使用maxBytesLocalHeap配置了单个缓存区域。 我的域模型非常复杂,我知道我可以使用@IgnoreSizeOf注释来限制图形的行走,但我不确定如何解决这个问题: 我是否必须忽略双向关联的一方以避免循环? 我是否必须明确忽略我的域模型类的瞬态成员? 一般来说,将EhCache与Hibernate一起使用时使用maxBytesLocalHeap是否明智,还是应该选择maxEntriesLocalHeap ,因为Hibernate为每个实体保留了一个单独的缓存区域? [更新] :我发现,临时成员不会被Hibernate缓存(参见Hibernate:是否可以在二级缓存中保存瞬态字段? ),所以不管怎么说它们都不应该被ehcache看待。 […]

指定全局EhCache容量

我正在尝试将我的项目代码从OSCache迁移到EhCache。 我们不仅将OSCache用作二级Hibernate缓存提供程序,还用于存储其他不同性质的对象。 由于非重叠的缓存键,他们都愉快地共享相同的缓存实例而没有任何冲突。 移向EhCache时的一个重要区别是每个区域都有不同的缓存实例。 这可能是好的,因为它可以提高查找速度,因为不同性质的数据分别驻留。 不幸的是,这有配置地狱的代价。 让我解释。 在OSCache世界中,我将配置我的缓存容量,比方说,10000。现在,如果特定安装需要/可以提供更多的RAM,我会轻松地将其增加到50000,这样做。 现在在EhCache中,我必须为每个区域更改此​​delta的部分设置! 此外,一个安装可能具有更高类型X对象的使用,而另一个安装可能更喜欢更高类型的Y对象流失。我们有几十个安装,每个安装将有数百个不同的缓存。 为此,我们不得不雇佣一大群人,除了监控缓存模式和调整设置外什么都不做! 我期望CacheManager具有某种全局缓存容量设置,并且每个内部缓存将争取更多容量,具体取决于条目使用情况。 然而,我发现设置缓存容量的唯一方法是通过CacheConfiguration ,它与CacheManager是多对一的。 到目前为止,我能看到的唯一选择是尝试强制Hibernate为所有实体使用一个全局缓存。 有谁知道怎么做? 我的方案还有其他更好的解决方案吗?