Java ehCache,如何替换成员
Java ehCache, how to replace members
我有一个简单的方法,我已经注释了缓存。
@Cacheable(value = "devices", key = "#hardwareId", unless = "#result == null")
public Device get(String hardwareId)
我有一种机制可以知道何时有人更改了基础数据库。这样我就知道从缓存中驱逐一个成员,以便下一次调用将返回到数据库。
getCache().remove(hardwareId);
我想做什么 替换缓存中的元素。这样做的原因是对数据库的回调可能需要 1000 毫秒,我不希望该方法的性能出现问题。
据我所知,我有两个选择。
选项 1:
当我驱逐成员时,当时回调到服务中。
getCache().remove(hardwareId);
service.get(hardwareId);
选项 2:
- 创建 'net.sf.ehcache.bootstrap.BootstrapCacheLoader' 的实例
在启动时注册要通知的相同 class 元素
正在从缓存中删除 (notifyElementRemoved())。
- 在@PostContruct 上获取所有用@Cacheable 注释的方法。创建地图
'cacheName' 到方法实例(java 反射方法)
当 notifyElementRemoved() 被触发时,使用缓存名称获取 Method 实例,通过调用它来触发缓存被重新填充。
Method method = map.get(cacheName);
// Add magic here to get the service.
Object serviceInstance = applicationContext.getBean("deviceService");
if (Proxy.isProxyClass(serviceInstance.getClass())) {
Proxy.getInvocationHandler(serviceInstance).invoke(serviceInstance, method, new Object[] {objectKey});
} else {
method.invoke(serviceInstance, objectKey);
}
选项 1 的缺点是我必须修改 30+ classes 以放入回调服务的逻辑。
方案2的缺点是有点复杂,感觉如果ehCache能提供这个功能就好了。它知道它包装了什么方法,它知道调用这个方法的 key/parameters 是什么。
这两个选项的缺点是总会有缓存不包含成员的时候,这可能会导致性能下降。
我的问题是,ehCache 是否提供了我想要的功能,或者是否有另一种机制可以在缓存零时间为空的情况下替换缓存中的成员?
不要做选项 2。太复杂了。一般来说,它的方式是有一个 @Cacheable
和一个 @CachePut
方法。为什么不使用它?
@Cacheable(value = "devices", key = "#hardwareId", unless = "#result == null")
public Device get(String hardwareId)
@CachePut(value ="devices", key= "#hardwardId", unless = "#result == null")
public Device update(String hardwareId)
应该可以彻底解决你的问题。
顺便说一句,您不需要指定 key
。它是隐式的。
我有一个简单的方法,我已经注释了缓存。
@Cacheable(value = "devices", key = "#hardwareId", unless = "#result == null")
public Device get(String hardwareId)
我有一种机制可以知道何时有人更改了基础数据库。这样我就知道从缓存中驱逐一个成员,以便下一次调用将返回到数据库。
getCache().remove(hardwareId);
我想做什么 替换缓存中的元素。这样做的原因是对数据库的回调可能需要 1000 毫秒,我不希望该方法的性能出现问题。
据我所知,我有两个选择。
选项 1:
当我驱逐成员时,当时回调到服务中。
getCache().remove(hardwareId);
service.get(hardwareId);
选项 2:
- 创建 'net.sf.ehcache.bootstrap.BootstrapCacheLoader' 的实例 在启动时注册要通知的相同 class 元素 正在从缓存中删除 (notifyElementRemoved())。
- 在@PostContruct 上获取所有用@Cacheable 注释的方法。创建地图 'cacheName' 到方法实例(java 反射方法)
当 notifyElementRemoved() 被触发时,使用缓存名称获取 Method 实例,通过调用它来触发缓存被重新填充。
Method method = map.get(cacheName); // Add magic here to get the service. Object serviceInstance = applicationContext.getBean("deviceService"); if (Proxy.isProxyClass(serviceInstance.getClass())) { Proxy.getInvocationHandler(serviceInstance).invoke(serviceInstance, method, new Object[] {objectKey}); } else { method.invoke(serviceInstance, objectKey); }
选项 1 的缺点是我必须修改 30+ classes 以放入回调服务的逻辑。
方案2的缺点是有点复杂,感觉如果ehCache能提供这个功能就好了。它知道它包装了什么方法,它知道调用这个方法的 key/parameters 是什么。
这两个选项的缺点是总会有缓存不包含成员的时候,这可能会导致性能下降。
我的问题是,ehCache 是否提供了我想要的功能,或者是否有另一种机制可以在缓存零时间为空的情况下替换缓存中的成员?
不要做选项 2。太复杂了。一般来说,它的方式是有一个 @Cacheable
和一个 @CachePut
方法。为什么不使用它?
@Cacheable(value = "devices", key = "#hardwareId", unless = "#result == null")
public Device get(String hardwareId)
@CachePut(value ="devices", key= "#hardwardId", unless = "#result == null")
public Device update(String hardwareId)
应该可以彻底解决你的问题。
顺便说一句,您不需要指定 key
。它是隐式的。