我要求在一个表中具有递归关系的元素:
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/