Spring数据找不到最新数据

时间:2018-03-08 10:24:49

标签: java jpa caching spring-data spring-data-jpa

我为我的应用程序配置了spring数据,其中我的DAO接口将org.springframework.data.repository.CrudRepository扩展为执行者简单的数据库操作。即使我的数据库具有最新数据,DAO的findOne(id)方法之一也不会返回表的最新记录。它总是返回旧版本的记录。没有为应用程序配置缓存。是否有任何默认的JPA级别缓存阻止它返回最新数据?

编辑:我在保存记录后调用em.flush(),因此后续调用findOne(id)必须给我最新记录。

但是,我看到一个潜在的问题,我的整个应用程序都在集群环境中运行,因此调用em.flush()可能只在一个更新数据的节点刷新数据,而所有其他节点仍然可能有可能导致后续调用findOne(id)方法的旧数据正在通过其他可能尚未发生刷新的节点。有没有一种方法可以跨节点刷新,还是有自动刷新数据的默认超时?

1 个答案:

答案 0 :(得分:0)

您可以尝试为休眠禁用二级缓存。在您使用集群环境时,根据我的理解,当您创建/更新任何内容时,它都会更新请求所在的一个集群的缓存,而不会更新另一个集群。但是,当您尝试获取相同的记录并且您的请求转到另一个群集时,它将为您提供旧的记录,而不是最新的记录。

您可以使用以下配置:

jpa:
  properties:
    hibernate:
      #################### HIBERNATE EHCACHE ####################
      #Disable second level cache for hibernate
      cache:
        use_second_level_cache: false
        auto_evict_collection_cache: false
        region:
          factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
        use_query_cache: true

此外,而不是使用findOne()方法,您应该像在2.0版本中一样使用findById(),Spring-Data-JPA修改了findOne(),现在它返回了Optional。防止NullPointerException并不是很糟糕。

See this for more info.

如果我弄错了,请纠正我。