2013-08-23 2 views
0

Я использую guava-библиотеки LoadCache для кэширования классов в моем приложении.Использование guava-библиотек LoadingCache для кэширования java pojo

Вот класс, который я придумал.

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 для данного идентификатора, если я не кеширую?

ответ

0

Да, он создает кэш объектов MethodMetricsHandler. Этот подход, как правило, не плох, однако я могу сказать больше, если вы описали свой вариант использования, потому что это решение довольно необычно. Вы частично заново изобрели заводскую модель.

думаю также о некоторых предложениях:

  • Это очень странно, что вам нужно вызвать 3 сеттеров перед запуском getHandler
  • В разделе «Конфигурация» не в ключе, вы получите тот же объект из кеш для разных конфигураций и тот же целевой класс и метод
  • Почему targetClass является Object. Вместо этого вы можете передать Class<?>.
  • Планируете ли вы выселить объекты из кеша?
+0

Я знаю очень уникальный и нечетный случай. Библиотека в основном проверяет метаданные класса каждый раз, когда класс запускается в приложении. Кэш будет жить в течение всего срока службы приложения, поэтому могут быть n invocations, поэтому n объектов MethodMetricsHandler, если я не кэширую. Классы, которые входят в экземпляр метода MethodMetricsHandler, не могут быть изменены. Однако я вижу проблему с сеттерами, так как это будет работать в многопоточной среде. Любые предложения по изменению дизайна, чтобы сделать его потокобезопасным? – MWright

Смежные вопросы