Реализовать среду кэширования (ehcache) для кэширования выпадающих значений поискового кода и местоположения во время запуска сервера

#java #spring #spring-boot #hibernate #caching

#java #весна #весенняя загрузка #спящий режим #кэширование

Вопрос:

Я хочу загрузить как поисковый код, так и данные о местоположении из базы данных в кэш-память, используя Spring ehCache при запуске приложения, т.е. При запуске сервера до вызова любого другого метода. В будущем будет добавлено еще несколько выпадающих списков. Таким образом, должен быть общий метод кэширования любых поступающих данных на основе критериев выпадающих данных.

Для поискового кода и местоположения уже написаны сущность, репозиторий и служба

Я написал ниже для реализации среды кэширования:

ehcache.xml

<cache name= "LookupCodeRepository.getDropdownValues"/> <cache name= "LocationRepository.getDropdownValues"/>

application.properties

  spring.jpa.properties.hibernate.cache.use_second_level_cache = false
 spring.jpa.properties.hibernate.cache.use_query_cache = false
 spring.jpa.properties.hibernate.cache.region.factory_class =
 org.hibernate.cache.ehcache.EhCacheRegionFactory
 spring.jpa.properties.hibernate.cache.provider_class =
 org.hibernate.cache.EhCacheProvider
 spring.jpa.properties.hibernate.cache.use_structured_entries = true
 spring.jpa.properties.hibernate.cache.region_prefix =
 spring.jpa.properties.hibernate.cache.provider_configuration_file_resource_path
 = ehcache.xml spring.jpa.properties.hibernate.cache.use_second_level_cache
  

и использовать hibernate-ehcache jar в pom.xml

WebConfig.java

  @Configuration public class WebConfig implements
 ServletContextInitializer{
 
 @Autowired CustomCache cache;
 
 @Override public void onStartup ( ServletContext servletContext)
 throws ServletException{
 
 cache.loadCache();
 
 }
  

CustomCache.java

  public class CustomCache {
 
 @Autowired private LookupCodeService lkupSer;
 
 @Autowired private LocationService locSer;
 
 public void loadCache(){
 
 List<LookupCode> lkup = lkupServ.getDropdownValues();
 
 List<Location> locat = locSer.getDropdownValues();
 }
  

Итак, здесь в loadCache() методе вместо вызова каждой отдельной
службы это должно быть похоже на автоматическое. Какая бы служба ни была создана
, она должна автоматически кэшироваться. Таким образом, должен быть общий метод
кэширования любых поступающих данных на основе критериев
выпадающих данных.

Как это реализовать?

Комментарии:

1. Пожалуйста, правильно отформатируйте вопрос (код должен быть кодом и т. Д.), Не используйте кавычки для всего. В настоящее время ваш вопрос нечитаем.

Ответ №1:

Службы, с которыми вы хотите работать, имеют общий метод. Определите интерфейс для этого метода:

    interface ProvidesDropdownValues<T> { 
     List<T> getDropdownValues(); 
   }
  

Теперь вы можете сделать:

     class DropdownValuesService {
      @Autowired ApplicationContext context;
      @Cacheable List getDropdownValues(String beanName) {
        ProvidesDropdownValues<?> bean = ((ProvidesDropdownValues) context.getBean(beanName));
        return bean.getDropdownValues();
      }
    }
  

Если у ваших служб нет имен компонентов, вы можете вместо этого работать с именами классов.

Для загрузки при запуске вы могли бы сделать:

   class StartupWarmupService {
    @Autowired ApplicationContext context;
    @Autowired DropdownValuesService dropDowns;
    @PostConstruct void startup() {
      for (String n : context.getBeanNamesForType(ProvidesDropdownValues.class)) {
        dropDowns.getDropdownValues(n);
      }
    }
  }
  

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

Отказ от ответственности: я не являюсь активным пользователем Spring, поэтому детали могут быть неверными, но базовый подход должен сработать.