- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对 ehcache API 还是个新手,所以我可能遗漏了一些明显的东西,但这是我当前的问题。
我目前有一个永久磁盘缓存存储在我的服务器上。我目前正在实现一种被动的后写缓存方法,该方法将键/值对保存到数据库表中。如果永久性磁盘缓存丢失,我想从数据库表中恢复缓存。
我用于后写逻辑的示例:
http://scalejava.blogspot.com/2011/10/ehcache-write-behind-example.html
我正在使用以下方法构建持久磁盘:
import com.googlecode.ehcache.annotations.Cacheable;
import com.googlecode.ehcache.annotations.KeyGenerator;
import com.googlecode.ehcache.annotations.PartialCacheKey;
@Cacheable(cacheName = "readRuleCache", keyGenerator=@KeyGenerator(name="StringCacheKeyGenerator"))
public Rule read(@PartialCacheKey Rule rule,String info) {
System.out.print("Cache miss: "+ rule.toString());
//code to manipulate Rule object using info
try{
String serialziedRule =objectSerializer.convertToString(Rule);
readRuleCache.putWithWriter(new Element(rule.toString(),serialziedRule ));
}
catch(IOException ioe)
{
System.out.println("error serializing rule object");
ioe.printStackTrace();
}
return rule;
}
我在 CacheWriter 实现中覆盖的写入方法工作正常。事情正在被保存到数据库中。
@Override
public void write(final Element element) throws CacheException {
String insertKeyValuePair ="INSERT INTO RULE_CACHE (ID, VALUE) VALUES " +
"('"+element.getObjectKey().toString()+"','"
+element.getObjectValue().toString()+"')";
Statement statement;
try
{
statement = connection.createStatement();
statement.executeUpdate(insertKeyValuePair);
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
查询字符串并将其反序列化回对象也可以正常工作。我已经验证对象的所有值都存在。当我删除 *.data 文件并重新启动应用程序时,磁盘持久缓存也会被填充:
public void preLoadCache()
{
CacheManager cacheManager = CacheManager.getInstance();
readRuleCache = cacheManager.getCache("readRuleCache");
Query query=em.createNativeQuery("select * from RULE_CACHE");
@SuppressWarnings("unchecked")
List<Object[]> resultList = query.getResultList();
for(Object[] row:resultList)
{
try {
System.out.println("Deserializing: "+row[1].toString());
Rule rule = objectSerializer.convertToObject((String)row[1]);
rule= RuleValidator.verify(rule);
if(rule!=null)
{
readAirRuleCache.putIfAbsent(new Element(row[0], rule));
}
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
问题
一切看起来都很好。但是,当我使用应该存在于缓存中的键传递 Rule 对象时,无论如何都会调用“read”方法,并且 *.data 文件大小会增加。尽管数据库的写入方法不会尝试再次插入现有键。关于我做错了什么的任何想法?
最佳答案
事实证明这是罪魁祸首:
keyGenerator=@KeyGenerator(name="StringCacheKeyGenerator")
我阅读的源 Material 建议我覆盖的“toString()”方法将用作缓存键/值对的键。经过进一步研究,事实证明这是不正确的。尽管使用了“toString()”键。它嵌套在类信息中以创建更大的 key 。
引用:
http://code.google.com/p/ehcache-spring-annotations/wiki/StringCacheKeyGenerator
示例预期键:“[49931]”
示例实际 key :“[类 x.y.z.WeatherDaoImpl,getWeather 类 x.y.z.Weather,[类 java.lang.String],[49931]]”
关于java - 使用@Cacheable 注释时忽略预加载的 Ehcache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21418916/
对于 Lucene,我们有一个很好的工具箱,如 Luke查看、诊断、编辑等。我们是否有类似的工具(至少显示)用于 EhCache(当我们启用 diskPersistent 时)? 最佳答案 我不知道有
我必须集成 spring 和 ehcache,并尝试使用 来实现它阻塞缓存 图案 有一个选项自填充缓存范围 对于 共享(默认)和方法 .你能解释一下有什么区别吗? 还有注解 @可缓存与 自我填充 旗
我有一个配置为使用 JPA 和 Hibernate 的大型 Java 应用程序。据说它还被配置为对实体和查询缓存使用 ehcaching。但是,我打开了 sql 日志记录,并且没有缓存任何实体。所有实
正如您在标题中看到的那样,问题很清楚,很高兴听到您对 adv./disadv 的想法。它们之间的差异。 更新:我决定使用 Hazelcast,因为它具有分布式缓存/锁定机制等优点,并且在适应您的应用程
我知道属性“updateCheck”可以在 XML 中设置为“false”,如下所示: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xs
我在不同的类中创建了两个方法,并使用 @Cacheable 注释对它们进行注释,并给出了相同的缓存名称,如下所示: class MyClass{ @Cacheable(value="inSco
我正在尝试新的 ehcache 版本,但我注意到,显然,没有搜索 API。 这是正常的还是我错过了什么?文档没有说明这一点。 最佳答案 主要原因是在缓存中搜索在到期和驱逐时具有非常奇怪的语义。由于 E
在 Ehcache 2 中,可以使用 calculateInMemorySize() 获取内存中的大小,例如: CacheManager manager = CacheManager.create()
如果我有以下配置: timeToIdleSeconds 的值是多少用于缓存 test ?它会从默认缓存继承,因此等于 120,还是会采用手册中给出的默认值,即 0(无穷大)? 最佳答案 timeT
我正在使用 ehcache 通过 hibernate 缓存实体。 查看ehcache监视器,一切似乎都工作正常(刷新将缓存计数设置为零,然后重新加载将计数放回一),但是如果我直接在数据库上更改某些值并
ehcache 是一个高度可配置的野兽,示例相当复杂,通常涉及多层接口(interface)。 有没有人遇到过最简单的例子,它只是在内存中缓存一个数字(不是分布式的,没有 XML,尽可能少的 java
net.sf.ehcache.CacheManager.ALL_CACHE_MANAGERS 是否有替代品?在 org.ehcache ehcach
使用 Ehcache 3.1,我可以知道当前存储在 ehcache 中的元素的大小以及缓存到目前为止的命中和未命中数。我认为 2.6 有 .getStatistics(),它做类似的事情,但是我在 3
我是 Spring 框架中的 ehcache v/s ehcache-core 的初学者,我的 pom.xml 使用的是 ehcache 版本 1.5.0 net.sf.ehcache ehcach
我正在运行一个使用 Ehcache 3.4.0 的网络应用程序。我有一个缓存配置,它定义了 1000 个内存中对象的简单默认值: java.lang.Object java.lang
我想找到一种在 ehCache 装饰器类中使用 Spring 依赖注入(inject)的好方法。我的 ehcache.xml 具有以下缓存配置: 我有以下装饰器实现: public cl
我想弄清楚最新版本的 Ehcache(2.7.0、2.7.1、2.7.2、2.7.4、2.7.5、2.8.0)是否真的有新版本的 ehcache-core或者如果 ehcache-core 自版本 2
我们在 WebLogic Server 10.3.4 上运行 Spring 3.0.5 Web 应用程序Solaris with Sun JVM 1.6.0_x 64bit 使用 EhCache 2.
ehcache 3.8.1 是否不再自动获取源根目录下的 ehcache.xml 文件中的配置设置? 最佳答案 是的,看起来是这样,现在需要使用 XML 文件来完成 configuringe a Ca
http://ehcache.org/generated/2.9.0/html/ehc-all/#page/Ehcache_Documentation_Set%2Fco-use_supported_t
我是一名优秀的程序员,十分优秀!