Tag: 缓存

Ehcache设置为永恒,但无论如何都会忘记元素?

我正在尝试配置Ehcache(版本2.5),以便它永远不会忘记项目。 我正在以编程方式配置,我没有触及任何配置XML文件。 通过将eternal设置为true ,我的理解是,如果我的磁盘空间不足或超过maxBytesLocalDisk (或者如果应用程序终止),则可以从缓存中删除项目的唯一情况。 但是,此测试程序未显示该行为: public static void main(String[] args) { CacheManager cacheManager = CacheManager.create(); Cache cache = new Cache( new CacheConfiguration().name(“test”) .overflowToDisk(true) .eternal(true) .maxBytesLocalHeap(1, MemoryUnit.MEGABYTES) .overflowToOffHeap(false) .maxBytesLocalDisk(100, MemoryUnit.GIGABYTES) .maxElementsOnDisk(0) .timeToIdleSeconds(0) .timeToLiveSeconds(0) .diskStorePath(“E:\\Data\\Ehcache”)); cacheManager.addCache(cache); for(int i = 0; i < 1000000; i++){ cache.put(new Element("key_" + i, "value_" + i)); } System.out.println(cache.getSize()); } 因此,在我的缓存中添加了100万个元素之后,我告诉它溢出到一个数量级足够大的磁盘,最后我只得到了3276个项目。 这里发生了什么?

可靠地迫使番石榴地图被驱逐

编辑:我重新组织了这个问题,以反映自那以后可用的新信息。 这个问题是基于对Viliam关于Guava Maps使用懒惰驱逐的问题的回答:Guava地图中的驱逐懒惰 请首先阅读这个问题及其回答,但基本上结论是,番石榴地图不会异步计算并强制执行驱逐。 给出以下地图: ConcurrentMap cache = new MapMaker() .expireAfterAccess(10, TimeUnit.MINUTES) .makeMap(); 在访问条目后十分钟过后,在再次“触摸”地图之前,它仍然不会被驱逐。 已知的方法包括常用的访问器 – get()和put()以及containsKey() 。 问题的第一部分[已解决]:其他调用会导致地图被“触摸”? 具体来说,有没有人知道size()属于这一类? 想知道这一点的原因是我已经实现了一个计划任务来偶尔轻推我用于缓存的Guava地图,使用这个简单的方法: public static void nudgeEviction() { cache.containsKey(“”); } 但是我也使用cache.size()以编程方式报告地图中包含的对象数量,以此确认此策略是否正常工作。 但我无法看到这些报告的差异,现在我想知道size()也会导致驱逐。 答:因此Mark指出在第9版中,只有get() , put()和replace()方法get()调用驱逐,这可以解释为什么我没有看到containsKey()的效果。 这显然会随着即将发布的下一版番石榴而改变,但遗憾的是我的项目发布时间越早。 这让我陷入了一个有趣的困境。 通常我仍然可以通过调用get(“”)来触摸地图,但我实际上正在使用计算地图: ConcurrentMap cache = new MapMaker() .expireAfterAccess(10, TimeUnit.MINUTES) .makeComputingMap(loadFunction); 其中loadFunction从数据库加载与该键对应的MyObject 。 它开始看起来像我没有简单的方法强迫驱逐直到r10。 但是,即使能够可靠地强制驱逐,我的问题的第二部分仍然存在疑问: 我的问题的第二部分[已解决]: 针对相关问题的其中一个回复 ,是否触摸地图可靠地逐出所有过期的条目? 在链接的答案中, Niraj Tolia另有说明,称驱逐可能只是分批处理,这意味着可能需要多次触摸地图以确保所有过期的对象被驱逐。 他没有详细说明,但这似乎与基于并发级别的地图被拆分成相关。 […]

将ConcurrentLinkedHashMap集成到Guava中意味着什么?

我们在项目中使用来自https://code.google.com/p/concurrentlinkedhashmap/的 ConcurrentLinkedHashMap,我看到了一条说明,它在2010年被集成到了Guava的MapMaker和CacheBuilder中。信息非常简短: 将算法技术集成到MapMaker中将在Google Guava r08中发布,并且很大程度上基于此版本。 这究竟是什么意思? concurrentlinkedhashmap项目似乎仍处于活动状态。 它只是一次性集成来引导Guava缓存包吗? 这两个项目自2010年以来是否独立发展? 如果是这样,今天它们之间的主要区别是什么?

获取对象字段前值hibernate JPA

我们假设我有这个课程: @EntityListeners({MyListener.class}) class MyClass { String name; String surname; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSurname() { return name; } public void setSurname(String name) { this.name = name; } public void save() { JPA.em().persist(this); return this; } public void update() { JPA.em().merge(this); } […]

ThreadLocal HashMap vs ConcurrentHashMap用于线程安全的未绑定缓存

我正在创建一个具有以下特征的memoization缓存: 高速缓存未命中将导致计算和存储条目 这个计算非常昂贵 这种计算是幂等的 无界限(条目从未删除)因为: 输入将导致最多500个条目 每个存储的条目都很小 缓存相对短缺(通常不到一小时) 总的来说,内存使用不是问题 将有成千上万的读取 – 在缓存的生命周期中,我预计99.9%+缓存命中 必须是线程安全的 什么会有一个优越的性能,或在什么条件下一个解决方案优于另一个解决方案? ThreadLocal HashMap: class MyCache { private static class LocalMyCache { final Map map = new HashMap(); V get(K key) { V val = map.get(key); if (val == null) { val = computeVal(key); map.put(key, val); } return val; } } private final […]

是否缓存了ArrayList.size()方法?

我想知道,是否可以在现有的ArrayList缓存上调用size()方法? 或者,在性能关键代码中,我只将size()存储在本地int中是否更可取? 当你不在调用size()之间添加/删除项目时,我希望它确实被缓存。 我对吗? 更新 我不是在谈论内联或类似的事情。 我只是想知道方法size()本身是否在内部缓存值,或者它是否在每次调用时动态计算。

浅浅和平等有什么区别? 这是如何应用于缓存的?

在我的笔记中找到以下内容,但我无法理解它: 基元类型包装类为有限数量的值实现缓存。 这保证了有限数量的深度相等的包装器对象也非常相等:如果o1.equals( o2 )则o1 == o2 。 例如, new Integer( 0 ) == new Integer( 0 ) 。 一般来说,这并不总是有效。 例如,new Integer(666)== new Integer(666) 可能不会举行。 缓存的原因是它可以节省内存。 通常,缓存适用于“小”原始值。 我不明白这是什么意思,或深(.equals())和浅(==)等于之间的区别。 我知道在实践中,.equals必须用于对象,而==用于Integral值,但实际的推理却暗示了我。 我假设通过名称浅可能只检查两个值是否具有相同的类型和名称,深层检查两个变量是否指向同一个对象? 我不知道缓存会如何在这里发挥作用,或者为什么它会有用。

具有复杂键的Spring @Cacheable仍然执行

我在Spring(3.1)中使用@Cacheable时有以下内容: 弹簧: Maven的: net.sf.ehcache ehcache-core 2.5.3 要缓存的方法: @Cacheable(value=”cahceName”, key=”concat(#param1).concat(‘-‘).concat(#param2)”) public String cachedMethod(String param1,String param2) 唉,当我调试代码时,我发现即使param1和param2相同(即不使用cahce),缓存的方法也会被多次调用。 有任何想法吗?

Hibernate的本机查询和缓存机制

我有一个关于Hibernate缓存机制的问题。我在文章中读到了hibernate中本机SQLquery的执行,使缓存的所有区域无效,因为hibernate对它将影响哪个特定实体一无所知。 这里所有缓存区域意味着我们在谈论二级缓存的各个区域或两级缓存(第一级缓存,二级缓存)还是仅二级缓存或仅第一级缓存?

Spring:hibernate + ehcache

我正在使用一个使用hibernate的spring项目,并期望使用ehcache实现二级缓存。 我看到了很多方法: spring-modules-cache引入了@Cacheable注释 ehcache-spring-annotations一个工具集,旨在成为spring-modules-cache的inheritance者。 Hibernate cache很好地集成到hibernate本身,以使用例如@Cache注释执行缓存。 使用代理的Programmatic cache 。 基于注释的配置很快变得有限或复杂(例如,几个级别的注释嵌套) 就个人而言,我不认为spring-modules-cache足够彻底,因此我可能更愿意考虑更积极开发的ehcache-spring-annotations 。 Hibernate cache虽然似乎是最完整的实现(例如,读取和写入缓存等)。 什么会激励使用哪个工具集? 请分享您的缓存体验……