Как кэшировать данные при запуске приложения в загрузочном приложении Spring - PullRequest
0 голосов
/ 06 июня 2019

У меня есть загрузочное приложение Spring, подключающееся к базе данных SQL Server.Мне нужна помощь в использовании кэширования в моем приложении.У меня есть таблица для CodeCategory, в которой есть список кодов для многих кодов.Эта таблица будет загружаться каждый месяц, а данные меняются только один раз в месяц.Я хочу кэшировать всю эту таблицу при запуске приложения.При любых последующих вызовах таблицы следует получать значение из этого кэша вместо вызова базы данных.

Например,

List<CodeCategory> findAll();

Я хочу кэшировать указанное выше значение запроса БД во время запуска приложения.Если есть вызов БД, такой как List<CodeCategory> findByCodeValue(String code), он должен получить результат кода из уже кэшированных данных вместо вызова базы данных.

Пожалуйста, дайте мне знать, как этого можно добиться с помощью весенней загрузки и ehcache.

Ответы [ 4 ]

0 голосов
/ 06 июня 2019

Мой способ - определить общий обработчик кэша

@FunctionalInterface
public interface GenericCacheHandler {

List<CodeCategory> findAll();
 }

И его реализация, как показано ниже

@Component
@EnableScheduling  // Important
public class GenericCacheHandlerImpl implements GenericCacheHandler {

@Autowired
private CodeRepository codeRepo;

private List<CodeCategory> codes = new ArrayList<>();

@PostConstruct
private void intializeBudgetState() {
    List<CodeCategory> codeList = codeRepo.findAll();
    // Any customization goes here
    codes = codeList;
}

@Override
public List<CodeCategory> getCodes() {
    return codes;
}
}

Назовите его в Служебном слое, как показано ниже

@Service
public class CodeServiceImpl implements CodeService {

@Autowired
private GenericCacheHandler genericCacheHandler;

@Override
public CodeDTO anyMethod() {
    return genericCacheHandler.getCodes();
}   
}
0 голосов
/ 06 июня 2019

Как указывалось, установка ehcache занимает некоторое время, и она не работает полностью с @PostConstruct.В этом случае используйте ApplicationStartedEvent для загрузки кэша.

Репозиторий GitHub: spring-ehcache-demo


@Service
class CodeCategoryService{

   @EventListener(classes = ApplicationStartedEvent.class )
   public void listenToStart(ApplicationStartedEvent event) {
        this.repo.findByCodeValue("100");
   }

}

interface CodeCategoryRepository extends JpaRepository<CodeCategory, Long>{

    @Cacheable(value = "codeValues")
    List<CodeCategory> findByCodeValue(String code);
}


Примечание: Есть несколько способов, как указано другими.Вы можете выбрать в соответствии с вашими потребностями.

0 голосов
/ 06 июня 2019

Использовать CommandLineRunner интерфейс.По сути, вы можете создать Spring @Component и реализовать интерфейс CommandLineRunner.Вам придется переопределить его метод запуска.Метод run будет вызываться при запуске приложения.

@Component
public class DatabaseLoader implements 
CommandLineRunner {

   @override
   Public void run(.... string){
     // Any code here gets called at the start of the app.
  }}

Этот подход в основном используется для начальной загрузки приложения с некоторыми начальными данными.

0 голосов
/ 06 июня 2019

Используйте режим кэширования второго уровня для кэширования всех необходимых запросов к базе данных.

Для кэширования при запуске приложения мы можем использовать @PostContruct в любом классе обслуживания.

Синтаксис будет: -

@Service
public class anyService{

  @PostConstruct
  public void init(){
     //call any method
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...