gpt4 book ai didi

java - 使用@Cacheable 注释时忽略预加载的 Ehcache

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:06:01 24 4
gpt4 key购买 nike

我对 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com