我有一个Spring Boot应用程序连接到SQL Server数据库。在我的应用程序中使用缓存时,我需要一些帮助。我有一个CodeCategory表,其中有许多代码的列表。该表每月都会加载,并且数据每月仅更改一次。 我想在应用程序启动时缓存整个表。在随后的任何表调用中,都应从此缓存中获取值,而不是调用数据库。
例如,
List<CodeCategory> findAll();
我想在应用程序启动期间缓存以上数据库查询值。如果有类似List<CodeCategory> findByCodeValue(String code)
的数据库调用,则应该从已缓存的数据中获取代码结果,而不是调用数据库。
请让我知道使用spring boot和ehcache如何实现。
答案 0 :(得分:0)
使用第二级休眠缓存来缓存所有必需的数据库查询。
对于在应用程序启动时进行缓存,我们可以在任何Service类中使用@PostContruct。
语法为:-
@Service
public class anyService{
@PostConstruct
public void init(){
//call any method
}
}
答案 1 :(得分:0)
如前所述,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);
}
注意:其他人指出了多种方式。您可以根据自己的需要进行选择。
答案 2 :(得分:0)
使用 CommandLineRunner 界面。 基本上,您可以创建一个Spring @Component并实现CommandLineRunner接口。您将不得不覆盖它的run方法。 run方法将在应用程序的开头被调用。
@Component
public class DatabaseLoader implements
CommandLineRunner {
@override
Public void run(.... string){
// Any code here gets called at the start of the app.
}}
此方法通常用于使用一些初始数据来引导应用程序。
答案 3 :(得分:0)
我的方法是定义一个通用的缓存处理程序
@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 层中调用它
@Service
public class CodeServiceImpl implements CodeService {
@Autowired
private GenericCacheHandler genericCacheHandler;
@Override
public CodeDTO anyMethod() {
return genericCacheHandler.getCodes();
}
}