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

Spring启动,实体缓存问题?

禄源
2023-03-14

我在后台使用PostgreSQL数据库,在Spring Boot中使用Spring数据。

我有一个@Controller;

  1. 调用具有@Transactional(readOnly=false)的服务层方法。该方法从头构建实体对象,并使用entityRepository中内置的Spring数据将其保存到数据库中。saveAndFlush(实体)
  2. 然后通过RestTemplate调用共享同一数据库的远程API,传递先前保存的实体的生成Id。此服务器执行一些遗留处理并更新数据库值
  3. 调用服务层方法,该方法读取先前保存的实体,并最终将其作为对整个请求的响应返回

问题是,远程API在第2步中所做的更改没有反映在从第3步获取的db中。

@Transaction只是在步骤1左右,所以我会假设,特别是对于saveAndFlush调用,事务在退出该方法时结束?

我可以调用另一个@Controller方法,然后执行第3步,结果非常完美,远程API的更改反映得很好。

似乎Spring Boot/Data正在某个地方缓存整个请求的初始保存结果,这不是我想要的。有什么想法吗?

共有1个答案

鲁博雅
2023-03-14

您将看到OpenEntityManagerViewFilter在所有3个步骤期间将EntityManager绑定到您的请求的效果。请求中的EntityManager不会注意您在步骤2中所做的数据库更改。

假设您没有任何竞争条件(即,步骤3在步骤完成之前运行),您可以收回实体缓存。

// inject the entityManager into a custom repository, and
entityManager.getEntityManagerFactory().getCache().evict(YourEntity.class, id)
 类似资料:
  • 我运行一个Spring启动1.5.2应用程序。我想将缓存添加到我的服务方法中,我已经添加了Spring引导启动缓存maven依赖,我正在使用@Cacheable注释,但它没有生效,我在@配置类中创建了我的服务bean-这里有一个例子 下面是我的服务方法的一个例子 我的repoistory接口方法如下 每当我从RestController调用此服务方法时,缓存从未被触发,看起来它没有正确设置 我能做

  • 我想将主数据缓存到Redis。 所以,我写了这些代码。 和 和ymlfile 但是,缓存不工作... 无论何时调用printTest方法,都将执行“getTest”方法。Redis没有数据。。。我的代码中有什么问题? SpringBoot版本是1.4.0 依赖关系是

  • 我正在使用Spring方法级别的注释@cacheable来缓存我从数据库中获取的数据。我可以在服务器启动时使用上述注释执行缓存吗?我尝试了这个,但它再次从数据库而不是从缓存中获取。

  • 我对spring boot相当陌生,正在尝试使用Java持久性API hibernate mySQL持久性层构建spring boot应用程序。但当我试图使用entityManager获取所有记录时。createNamedQuery(“从学生s中选择*”,学生.class)。getResultList()它给了我以下异常。 Java语言lang.IllegalArgumentException:未

  • 我正在尝试让spring boot让浏览器缓存静态资源。我的资源位于“静态”下的类路径中。当我查看发回的标题时,我看到修改标题设置得很好,但不知何故,标题“缓存控制:无存储”也被添加了。 我已经看到了如何在Spring Boot中启用HTTP响应缓存的答案,但这似乎不适用于我,因为我没有使用Spring Security性,它不在类路径上。 我正在使用带有胸片的Spring启动1.4.0。 那么,

  • 我有一个简单的spring boot with redis应用程序,我正在构建该应用程序来缓存3个实体的主数据:电子邮件、产品和国家。我使用了spring boot starter依赖项 我还在应用程序中使用启动配置。属性文件 可缓存方法包括 问题是,一旦我从这个类加载其中一个方法,其他两个方法返回与第一个方法相同的数据,即使它们返回不同的列表,并且具有不同的可缓存注释值。我做错了什么?