当前位置: 首页 > 知识库问答 >
问题:

在@cacheput findAll()不从缓存中给出结果之后

戚明朗
2023-03-14

我正在学习Spring Boot缓存,以便在我们组织的项目中应用这个概念,我制作了一个名为Emploe Cache的示例项目。我的控制器和服务组件中有四个方法insert、update、get和getall,对于insert和get,@cacheable工作得很好。现在我第一次调用getAllEmployee(),然后它从数据库中提取数据。之后,我尝试使用@cacheput进行更新,它更新数据库中的值,并且再次调用GetAllEmployee(),但它没有从缓存返回更新的值。我还参考了@cacheput的文档。我也参考了一些其他的文件,比如这个和这个,但是我没有解决我的问题。而且,当我调用时,不会引发任何错误。
我尝试的是
这是我的两个API,来自emplyeeController.java

@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中获得的两个方法。我应用了不同的键来更新该方法,但没有起作用。我的getAll()方法没有参数,所以我尝试了无参数方法的所有关键技术,但也没有得到任何结果。

@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中的本机查询没有错误,因为它从数据库中给出结果。

@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()从缓存中更新一个值。

共有1个答案

喻渊
2023-03-14

通过注释定义缓存的方式存在一个问题。您的@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”的现有缓存值,该方法的结果是具有更新薪资的员工列表。

 类似资料:
  • 为牛顿方法编写实现雅可比矩阵的函数时,我注意到了一个非常严重的错误。 调用函数 仅返回,省略了的减法运算。但是如果我把代码改成 一切工作无缝。 我试图重现它,这不是完全相同的行为,但它也没有表现为想要的: 考虑下面的代码: 它会打印出来 到控制台。 但是,如果我更改为函数 控制台会打印 对于第二个矩阵。(这只是内存中一些未初始化的垃圾)。 有人能解释一下我的代码和示例问题发生了什么吗?我真的不知道

  • 问题内容: 我正在尝试找到一种方法来缓存不会随频率变化的查询结果。例如,来自电子商务的产品类别(手机,电视等)。我正在考虑使用模板片段缓存,但是在这个片段中,我将遍历这些类别的列表。该列表在网站的任何部分都可用,因此在我的文件中。渲染模板时是否总是要发送类别列表?还是有更动态的方法来执行此操作,以使列表始终在模板中可用? 问题答案: 将缓存的查询弹出到Django的缓存中: 然后创建一个上下文处理

  • 结果缓存 1,用于加速热门数据的访问速度,Dubbo 提供声明式缓存,以减少用户加缓存的工作量 2。 缓存类型 lru 基于最近最少使用原则删除多余缓存,保持最热的数据被缓存。 threadlocal 当前线程缓存,比如一个页面渲染,用到很多 portal,每个 portal 都要去查用户信息,通过线程缓存,可以减少这种多余访问。 jcache 与 JSR107 集成,可以桥接各种缓存实现。 缓存

  • null 根据密钥在缓存中查找 如果找到,则从缓存返回结果 如果未找到,则返回NULL 我不想在cache-miss的情况下更新缓存,有没有办法使用spring注释来做到这一点

  • 我正在使用Tomcat和JDBC连接池以及mysql数据库。当一个java。sql。创建连接并设置#setAutoCommit(false),在不提交的情况下执行select语句,然后关闭连接,它似乎会将缓存的连接返回到池。随后在执行相同选择的地方创建的后续连接返回数据库中的过时数据。这种行为似乎很奇怪,因为我被迫提交只执行选择的会话,否则我看不到其他节点反映的更改。有没有办法避免这种行为,或者我

  • 我正在使用Jmeter对我的ASP.NET应用程序进行负载测试。 我正在测试搜索功能,什么是在获得结果的响应时间。 我面临的问题是,当我第一次搜索时,说我搜索了“我很好”,并说它花了9876毫秒,下次我搜索同样的东西只需要4567毫秒,第三次只需要4234毫秒。 我正在使用HTTP缓存管理器,我已经检查了“每次迭代都清除缓存”。我还使用了Http Cookie管理器,并检查了“每次迭代清除Cook