gpt4 book ai didi

hibernate - 使 JPA EntityManager session 无效

转载 作者:行者123 更新时间:2023-12-04 04:56:11 25 4
gpt4 key购买 nike

我正在从事的一个项目使用 Spring 2.5 和 JPA 以及 Hibernate 作为提供者。

我的 DAO 类扩展了 JpaDaoSupport,所以我使用 getJpaTemplate() 方法获取我的 JpaTemplate。

后端数据库可以由我的应用程序或第三方应用程序更改。

当第三方应用程序更改数据库(主要是配置数据更改)时,我需要为我的应用程序用户提供一种使所有 JPA session 无效并重新加载新数据的方法(即在后台使所有 hibernate session 无效)。这需要被我的应用程序的所有并发用户“看到”。

我怎样才能做到这一点?

最佳答案

有两个级别的缓存:

  • 第一级是 EntityManager 自己的缓存。

    您可以 refresh在一个实体上,它将从数据库重新加载,或者您可以 clear实体管理器本身,在这种情况下,所有实体都从缓存中删除。 JPA没有办法到evict only one specific entity从缓存中。根据您使用的实现,您可以执行此操作,例如Hibernate的evict方法。
  • 二级缓存是全局缓存。

    JPA 1.0 不支持二级缓存。然后您需要依赖底层的特定实现,或者禁用它。 JPA 2.0 will address this issue@Cache注释和缓存 API。您可以使用特定于 Hibernate 的 API 清除二级缓存,例如SessionFactory.evict(...) .
  • Unerstanding Hibernate 2nd level cache

  • 缓存的高级问题是:
  • 查询缓存

    可以缓存某些查询的结果。在 JPA 1.0 中再次不支持它,但大多数实现都有方法来指定将缓存哪个查询以及如何缓存。
  • Understanding the query cache in Hibernate
  • 聚类

    然后还有在集群中的节点之间同步缓存的乏味问题。在这种情况下,这主要取决于所使用的缓存技术,例如JBoss 缓存。

  • 你的问题在某种程度上仍然是通用的,答案将取决于你到底在做什么。

    我在一个系统上工作,很多更新都可以在不经过 hibernate 的情况下完成,我们最终禁用了二级缓存。

    但是您也可以跟踪所有打开的 session ,并在必要时驱逐所有打开的 session 的所有一级缓存,以及二级缓存。您仍然需要自己管理同步,但我想这是可能的。

    关于hibernate - 使 JPA EntityManager session 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2400430/

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