在项目用到 EhCache 来cache 从数据库中query 出来的reference 数据。 按理说ehcahce 非常成熟了但是在用的它的addCacheIfAbsent api 时, 居然碰到它不是线程安全的。 从它api 字面上来说绝对不应该是线程不安全的, 放狗一搜果然是个bug。 这么低级的bug 还是在最新的版本2.7.0 才fix。 但是我们项目只用到它的ehcache-core.jar 不想用太多它的特性, 下了个 ehcache-core.2.6.9.jar 来看看 release 日期是 2041-4-8 但愿没有问题哈。
在它的网站上找的bug 的链接 https://jira.terracotta.org/jira/browse/EHC-970, 其中有段测试代码。 其中的代码居然有问题, 所以就改下 放到这个地方看看有没有大家需要的。
import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicLong; import net.sf.ehcache.CacheManager; import net.sf.ehcache.config.CacheConfiguration; import net.sf.ehcache.config.Configuration; import org.junit.Test; public class EhcacheTest { private static final String CACHE_NAME = "test-cache"; private CacheManager cm ; //= CacheManager.getInstance(); private final AtomicLong counter = new AtomicLong(0L); private int maxEntriesLocalHeap = 20000; private long maxBytesLocalHeap = 1024 * 1024 * 100; private boolean isExpiryTimeFixed = true; private int timeToIdleSeconds = 30 * 1000; private int timeToLiveSeconds = 30 * 1000; private boolean overflowToOffHeap = false; private boolean eternal = false; public Configuration getEhcacheConfig() { CacheConfiguration dcc = new CacheConfiguration(); dcc.setMaxEntriesLocalHeap(maxEntriesLocalHeap); if (maxEntriesLocalHeap == 0) { dcc.setMaxBytesLocalHeap(maxBytesLocalHeap); } dcc.setTimeToIdleSeconds(timeToIdleSeconds); dcc.setTimeToLiveSeconds(timeToLiveSeconds); dcc.setOverflowToOffHeap(overflowToOffHeap); dcc.setEternal(eternal); Configuration configuration = new Configuration(); configuration.setDefaultCacheConfiguration(dcc); configuration.setUpdateCheck(false);//application instant can not connect web site return configuration; } @Test public void test_10000_Executions() throws InterruptedException { final Executor executor = Executors.newFixedThreadPool(10); cm = CacheManager.create(getEhcacheConfig()); for (int i = 0; i < 100000; i++) { executor.execute(new CreateAndRemoveCache()); if ((i%1000) == 0) { } } while(counter.get() < 100000) { Thread.sleep(1000L); System.out.println("i=" + counter.get()); } } public class CreateAndRemoveCache implements Runnable { public CreateAndRemoveCache() { } @Override public void run() { cm.addCacheIfAbsent(CACHE_NAME); cm.removeCache(CACHE_NAME); counter.addAndGet(1); } } }
这段代码在 2.5.1 下会抛出 Item 已经存在的exception , 在 2.6.9 就不会。 好吧, 就暂时升级jar 来fix 这个问题把。
相关推荐
1.解压缩到目录下,复制ehcache-monitor-kit-1.0.0\lib\ehcache-probe-1.0.0.jar包到application的web-inf/lib目录下 2.将以下配置copy的ehcache.xml文件的ehcache标签中,注:上述链接中说的配置少写了个probe包名...
【标题解析】:“ehcache.xsd_ehcache.xml代码提示.rar”这个标题表明这是一个与Ehcache缓存系统相关的资源包,主要目的是为Ehcache的配置文件ehcache.xml提供代码提示功能。Ehcache是一个广泛使用的开源Java缓存...
赠送jar包:ehcache-3.3.1.jar; 赠送原API文档:ehcache-3.3.1-javadoc.jar; 赠送源代码:ehcache-3.3.1-sources.jar; 赠送Maven依赖信息文件:ehcache-3.3.1.pom; 包含翻译后的API文档:ehcache-3.3.1-javadoc-...
Ehcache是一个开源的、高性能的缓存解决方案,广泛应用于Java应用程序中,以提高数据访问的速度和效率。本文将深入探讨Ehcache的简单监控,帮助开发者更好地理解其工作原理和性能状态。 首先,了解Ehcache的核心...
Ehcache是一个广泛使用的开源Java缓存库,它为应用程序提供了高效的内存管理和数据缓存功能。Ehcache的核心目标是提高应用性能,通过将频繁访问的数据存储在内存中,减少对数据库的依赖,从而降低系统负载。这次我们...
Ehcache是一个高性能的、基于Java的进程内缓存解决方案,它被广泛应用于各种Java应用程序,包括Java EE和轻量级容器。Ehcache的主要优势在于它的快速响应、易用性和丰富的缓存策略。它提供了两种级别的缓存存储:...
赠送jar包:ehcache-3.9.9.jar; 赠送原API文档:ehcache-3.9.9-javadoc.jar; 赠送源代码:ehcache-3.9.9-sources.jar; 赠送Maven依赖信息文件:ehcache-3.9.9.pom; 包含翻译后的API文档:ehcache-3.9.9-javadoc-...
【标题】:“Hibernate + Ehcache 整合使用详解” 【描述】:“Hibernate 是一款流行的 Java 持久层框架,而 Ehcache 是一个高效的分布式内存缓存系统。将两者结合,能够极大地提升应用的性能,减少数据库的负载,...
EHcache是一款广泛使用的开源Java分布式缓存系统,主要设计用于提高应用程序的性能和可伸缩性。在Java应用程序中,特别是那些基于Hibernate或MyBatis的持久层框架中,EHcache作为二级缓存工具,能够显著提升数据访问...
本篇文章将详细探讨MyBatis与Ehcache的集成以及`ehcache.xsd`和`ehcache.xml`这两个配置文件在其中的作用。 首先,Ehcache是一个开源的、高性能的Java缓存库,它能够极大地减少对数据库的访问,提高应用程序的响应...
Ehcache 3 是一个广泛使用的开源Java缓存解决方案,特别是在需要高性能、低延迟的数据存储和检索场景下。Ehcache 3 提供了丰富的功能,包括本地内存缓存、磁盘持久化、多线程支持以及在分布式环境中实现集群共享缓存...
**Ehcache 知识详解** Ehcache 是一个开源的、高性能的缓存解决方案,广泛应用于Java应用程序中,尤其在提升系统性能和减少数据库负载方面表现突出。它支持内存和磁盘存储,并且可以与Java持久层框架如Hibernate、...
Ehcache是一个开源的Java缓存库,广泛用于提高应用程序的性能和响应速度,通过存储经常访问的数据在内存中,避免了频繁的数据库查询。它最初由Tomi Triebel开发,现在是Terracotta公司的产品。在版本2.6.5中,...
**Ehcache** 是一个广泛使用的Java缓存库,它为应用程序提供了本地内存缓存功能,以提高数据访问速度和减少数据库负载。Ehcache在处理高并发和大数据量的场景下表现出色,尤其适用于那些频繁读取但不经常修改的数据...
Ehcache是一款高性能、易用且广泛应用于Java环境中的分布式缓存系统,它极大地提高了应用程序的性能和响应速度。在Spring框架中集成Ehcache,能够实现数据的快速访问,减轻数据库的压力,优化整体系统架构。本文将...
ehcache是一种广泛使用的Java缓存框架,用于提高应用程序性能,特别是在数据访问操作中。通过将数据存储在内存中,ehcache能够显著减少数据库查询次数,从而加快应用响应速度。本文将深入探讨ehcache.xml配置文件中...
### Spring Boot集成Ehcache实现缓存 #### 一、Ehcache简介 Ehcache是一个高效的纯Java进程内缓存框架,以其快速且轻便的特点而被广泛应用于各种应用场景中,尤其在Java EE和轻量级容器环境中更是受到青睐。...
Ehcache是一款高效、流行的Java缓存库,它允许应用程序快速访问经常使用的数据,从而提高性能和响应速度。在分布式环境中,为了实现数据共享和高可用性,Ehcache提供了集群功能。而Jgroups则是Java中一个强大的集群...
EhCache是一款高效、易用且功能强大的Java缓存库,它被广泛应用于各种Java应用程序中,以提高数据访问速度并降低数据库负载。EhCache的核心特性包括内存和磁盘存储、缓存分区、过期策略以及缓存同步等。在Java开发中...
Mybatis-ehcache 1.2.1 是一个集成项目,它将 Ehcache 缓存系统与 Mybatis 框架结合在一起,提供了一种高效、便捷的数据缓存解决方案。在这一版本中,Ehcache 被用作 Mybatis 的二级缓存,以改善数据库查询性能并...