java - 当通过sql过程发生表更新时更新spring缓存

标签 java spring caching stored-procedures ehcache

我有一个带有 java 8 、jpa 等的 Spring Boot 应用程序和一个带有 j2ee 应用程序的 jboss 应用程序,它调用了太多的 sql 过程来更新表。

我在 Spring Boot 中有一个类似这样的查询来获取所有员工:

@Cacheable("employeeList")

List{Employee} findByAddressId(Long addressId);

但是,如果有人通过 jboss 应用程序的 sql 过程将新记录插入到 Employee 表中的同一地址 id 中,则 Spring Boot 应用程序将无法选择新记录,因为查询对于该地址 id 来说非常通用。

所以我想在插入和更新时在该表上创建一个触发器,因此当发生插入/更新时,它应该使用属于该地址 ID 的新记录更新缓存。

有人可以告诉我该怎么做吗?

最佳答案

如果我正确理解了这个问题,那么您有一个 Spring Boot 应用程序和一个单独的 jboss 应用程序,它们连接到同一数据库并插入/更新到相同的数据库表。

使用spring的@Cachable,你需要能够告诉spring何时应该驱逐缓存的项目。例如,将更新实体的方法标记为 @CacheEvict 是从缓存中逐出实体的简单方法。这里的问题是,如果 jboss 应用程序更新了一条记录,Spring Boot 应用程序就无法知道这一点。

使用数据库触发器似乎有问题,因为您必须以某种方式让数据库触发器与 Spring Boot 应用程序通信以允许发生驱逐。

一种解决方案可能是让 jboss 和 spring boot 应用程序都使用分布式缓存,例如带有 terracotta 的 ehcache。

关于java - 当通过sql过程发生表更新时更新spring缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41075259/

相关文章:

java - 在android项目中导入和使用jar文件

java - 设置属性值时出错;嵌套异常是 org.springframework.beans.NotWritablePropertyException :

java - 并发HashMap : remove on condition

java - 如何在内存中保存完整的Solr索引?

java - 使用 Spring 的 org.springframework.jdbc.object.StoredProcedure 调用 Oracle 存储过程

javascript - Angular - 带有动态模板的指令

Java 优先级队列 : Is it better to poll() and then add() or peek() and then remove()

java - 如何将抽象工厂与单例模式结合起来?

java - 重复使用 Java 的 SecureRandom

spring - JPA 中通过 ID 和版本删除对象