使用guava-libraries LoadingCache来缓存java pojo

时间:2013-08-23 09:34:23

标签: java caching guava

我正在使用guava-libraries LoadingCache来缓存我的应用程序中的类。

这是我提出的课程。

public class MethodMetricsHandlerCache {

  private Object targetClass;
  private Method method;
  private Configuration config;

  private LoadingCache<String, MethodMetricsHandler> handlers = CacheBuilder.newBuilder()
  .maximumSize(1000)
  .build(
      new CacheLoader<String, MethodMetricsHandler>() {
        public MethodMetricsHandler load(String identifier) {
          return createMethodMetricsHandler(identifier);
        }
      });


  private MethodMetricsHandler createMethodMetricsHandler(String identifier) {
  return new MethodMetricsHandler(targetClass, method, config);
 }

 public void setTargetClass(Object targetClass) {
  this.targetClass = targetClass;
 }

 public void setMethod(Method method) {
  this.method = method;
 }

 public void setConfig(Configuration config) {
  this.config = config;
 }

 public MethodMetricsHandler getHandler(String identifier) throws ExecutionException {
  return handlers.get(identifier);
 }

我正在使用此类来缓存MethodMetricsHandler

...
private static MethodMetricsHandlerCache methodMetricsHandlerCache = new MethodMetricsHandlerCache();

...
MethodMetricsHandler handler = getMethodMetricsHandler(targetClass, method, config);

private MethodMetricsHandler getMethodMetricsHandler(Object targetClass, Method method, Configuration config) throws ExecutionException {
 String identifier = targetClass.getClass().getCanonicalName() + "." + method.getName();
 methodMetricsHandlerCache.setTargetClass(targetClass);
 methodMetricsHandlerCache.setMethod(method);
 methodMetricsHandlerCache.setConfig(config);
 return methodMetricsHandlerCache.getHandler(identifier);
}    

我的问题:

这是否会创建一个以标识符键入的MethodMetricHandler类的缓存(之前没有使用过,只需要进行健全性检查)。

还有更好的方法吗?如果我不缓存,我将为给定的标识符提供相同MethodMetricHandler的多个实例(数百个)?

1 个答案:

答案 0 :(得分:0)

是的,它确实创建了MethodMetricsHandler对象的缓存。这种方法通常都不错,但是如果你描述了你的用例,我可能会说更多,因为这个解决方案很不寻常。你已经部分重新设计了工厂模式。

还要考虑一些建议:

  • 在运行getHandler
  • 之前需要调用3个setter是很奇怪的
  • 由于“配置”不在密钥中,您将从缓存中获取相同的对象以用于不同的配置和相同的targetClass和方法
  • 为什么targetClass是Object。您可能希望改为Class<?>
  • 您打算从缓存中逐出对象吗?