gpt4 book ai didi

java - @CachePut findAll() 后没有给出缓存结果

转载 作者:行者123 更新时间:2023-12-01 16:52:50 25 4
gpt4 key购买 nike

我正在学习 Spring Boot 缓存,以便将这个概念应用到我们组织的项目中,并且我制作了一个名为员工缓存的示例项目。我的 Controller 和服务组件中有四个方法 insert、update、get 和 getAll。For insert 和 get @Cacheable 工作正常。现在我第一次调用 getAllEmployee() 然后它从数据库中获取数据。之后,我尝试使用 @CachePut 进行更新,它更新数据库中的值,然后我再次调用 getAllEmployee() 然后它没有从缓存返回更新的值。我还引用了documentation对于@CachePut。我还引用了其他一些文件,例如 thisthis但我没有解决我的问题。另外,当我打电话时,没有出现错误。
我尝试过的是
这是我来自 EmplyeeController.java

的两个 API
@PostMapping(value = "/updateSalary")
private Boolean updateSalary(@RequestParam int salary, @RequestParam Integer id) {
return empService.updateSalary(salary, id);
}

@GetMapping(value = "/getAllEmployee")
private Object getAllEmployee() {
List<EmployeeMapping> empList = empService.getAllEmployee();
return !empList.isEmpty() ? empList : "Something went wrong";
}

这是我来自 EmployeeService.java 的两个方法。我应用了不同的 key 来更新该方法,但没有成功。我的 getAll() 方法没有参数,因此我尝试了 here 中无参数方法的所有关键技术。然后我也没有得到任何结果。

@CachePut(key = "#root.method.name")
public Boolean updateSalary(int salary, int id) {
System.err.println("updateSalary method is calling in service");
if (empRepo.salary(salary, id) != 0) {
return true;
}
return false;
}

@Cacheable(key = "#root.method.name")
public List<EmployeeMapping> getAllEmployee() {
return empRepo.findAllEmployee();
}

这是我来自 EmployeeRepository.java 的两个方法。我在 EmployeeMetaModel.java 中使用了 @SqlResultSetMappings@NamedNativeQueries 以及 EmployeeMapping.java 但 native 中没有错误在 EmployeeMetaModel.java 中查询,因为它从数据库中给出结果。

@Transactional
@Modifying
@Query("update employee_cache e set e.salary = ?1 where e.id = ?2")
int salary(int salary, int id);

@Query(name = "EmployeeListQuery", nativeQuery = true)
List<EmployeeMapping> findAllEmployee();

请帮助我摆脱这个问题,我只需要在调用 updateSalary() 后使用 getAllEmployee() 从缓存中更新值。

最佳答案

您通过注释定义缓存的方式存在问题。您的 @CachePut@Cacheable 不使用相同的缓存键。你实际上应该拥有的是这样的:

@CachePut(value = "employees", key = "T(org.springframework.cache.interceptor.SimpleKey).EMPTY")
public List<EmployeeMapping> updateSalary(int salary, int id) {
// update salary and return the list of employees
}

@Cacheable(value = "employees")
public List<EmployeeMapping> getAllEmployee() {
// return the list of employees
}

这里 @CachePut@Cacheable 具有相同的缓存键。d 现在,当您调用 updateSalary() 方法时,@CachePut 将用该方法的结果(即具有更新工资的员工列表)替换键“employees”的现有缓存值。

关于java - @CachePut findAll() 后没有给出缓存结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61656538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com