为了账号安全,请及时绑定邮箱和手机立即绑定

Spring boot应用程序启动时如何缓存数据

Spring boot应用程序启动时如何缓存数据

吃鸡游戏 2023-01-05 17:15:03

我有一个连接到 SQL Server 数据库的 Spring boot 应用程序。我需要一些帮助来在我的应用程序中使用缓存。我有一个 CodeCategory 表,其中包含许多代码的代码列表。该表将每月加载一次,数据每月仅更改一次。我想在应用程序启动时缓存整个表。在对表的任何后续调用中,都应从此缓存中获取值,而不是调用数据库。

例如,

List<CodeCategory> findAll();

我想在应用程序启动期间缓存上面的数据库查询值。如果有像这样的数据库调用,List<CodeCategory> findByCodeValue(String code)应该从已经缓存的数据中获取代码结果,而不是调用数据库。

请让我知道如何使用 spring boot 和 ehcache 来实现这一点。


查看完整描述

4 回答

?
摇曳的蔷薇

TA贡献1508条经验 获得超6个赞

正如所指出的,设置 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);

}



注意:其他人指出的方法有多种。您可以根据自己的需要进行选择。


查看完整回答
反对 回复 2023-01-05
?
繁星coding

TA贡献1500条经验 获得超4个赞

我的方法是定义一个通用的缓存处理程序


@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();

}   

}


查看完整回答
反对 回复 2023-01-05
?
翻过高山走不出你

TA贡献1609条经验 获得超3个赞

使用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.

  }}

这种方法主要用于使用一些初始数据引导应用程序。


查看完整回答
反对 回复 2023-01-05
?
慕无忌1623718

TA贡献1509条经验 获得超3个赞

使用二级休眠缓存来缓存所有需要的数据库查询。


为了在应用程序启动时缓存,我们可以在任何服务类中使用@PostContruct。


语法将是:-


@Service

public class anyService{


  @PostConstruct

  public void init(){

     //call any method

 }

}


查看完整回答
反对 回复 2023-01-05

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信