java - Spring Boot在bean中预加载数据库中的数据

标签 java spring datasource javabeans

我要求在一个表中具有递归关系的元素:

child ID |父 ID

1 |空

2 | 1

3 | 1

4 | 2

等等...要获取整个数据结构大约需要10秒。目前我无法重新设计这个表,因为它花费了太多时间(更多信息: Spring Repository performance issues with recursive ORM Class )

现在,我正在考虑在 Spring 启动期间将所有数据预加载到一个 bean 中,以便客户端与该 bean 进行“通信”,然后更新 bean 和数据库中的数据。我认为这个启动需要多长时间并不重要,重要的是用户需要等待多长时间才能得到答案。

到目前为止,我还没有成功预加载它。我试图创建一个像这样的bean:

public class AppConfig extends WebMvcConfigurerAdapter {
...
@Autowired
SkillDAO skillDAO
...
@Bean(name="allSkills")
public List<Skill> allSkills(){
    return skillDAO.findBySkill(null);
}
...

它不起作用,因为我收到错误:

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'dataSource': Requested bean is currently in creation: Is there an unresolvable circular reference?

顺便说一句,我在 AppConfig 中创建了所有 bean。当我删除这个“allSkills”bean 时,它会再次工作。

更新

@Component
public class MyListener {

@Autowired
private SkillDAO skillDAO;

@EventListener
public void onApplicationReady(ApplicationReadyEvent ready) {
    System.out.println("++++++++++++++ HALLO +++++++++++++");
    skillDAO.findBySkill(null);
}
}

...

@Bean(name="skillBean")
public MyListener myListener() {
    return new MyListener();
}

最佳答案

您可以收听 ApplicationReadyEvent ,然后调用该方法(来自 @yglodt 的 answer )来初始化您的缓存。

示例代码:

@Component
public class MyEventsListener {

    @Autowired
    SkillsService skillsService;

    @EventListener
    public void onApplicationReady(ApplicationReadyEvent ready) {
        skillsService.getAllSkills();
    }
}

还请记住,如果您从 SkillsService bean 本身内部调用 getAllSkills(),您将不会访问缓存,因为仅在注入(inject)的 proxy 上调用该方法时才会建议该方法。类(class)的。

如果您将应用程序部署为可执行 jar(而不是 war 文件),那么最简单的解决方案是从 main method 调用您想要在启动时运行的代码。 :

public class Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
        SkillsService skillsService = context.getBean(SkillsService.class);
        skillsService.getAllSkills();
    }

}

关于java - Spring Boot在bean中预加载数据库中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35427728/

相关文章:

javascript - React Native 如何清空数据源

java - 使用 itext 将多文本添加到现有 pdf

java - Spring - 匿名身份验证访问被拒绝

java - 如何检查Grails应用程序的GORM版本

java - 用 Java 制作客户端-服务器应用程序的试用版

c# - 带有 SQL Server 连接字符串的数据源属性

java - 使用 JavaPoet 生成自引用泛型

java - 无法从 struts.properties 读取某些字符串

java - 如何在给定的字符串数组的字符串索引处打印出该字符串的字符

java - 运行时具有多个数据源的 Spring Batch