【问题标题】:hibernate disabling cache休眠禁用缓存
【发布时间】:2011-10-13 10:09:20
【问题描述】:

我想禁用休眠缓存。

session.setCacheMode(CacheMode.IGNORE) 不起作用。
query.setCacheable(false) 也不行。

另外,我能否以某种方式配置不对对象 X、Y 进行缓存,而对对象 Z 进行缓存?

谢谢。

【问题讨论】:

  • 您能否更具体地了解您所指的哪个休眠缓存?有会话/一级缓存、二级缓存、查询缓存、集合缓存。
  • 我指的是会话缓存

标签: java hibernate


【解决方案1】:

您可以在从管理器获取可重用会话对象之前调用session.clear()

即在我们的项目中,我们必须在许多休眠会话之间同步更新(每个 http 会话一个)。第二级缓存工作正常,但必须禁用或清除第一级(每个会话)。因此,我们创建了 SessionManager 来存储所有会话并按需交付。就在传递电话session.clear() 之前,这解决了问题。

直到你完成你的工作单元 - 一级缓存没问题。

【讨论】:

    【解决方案2】:

    在配置休眠会话工厂时尝试类似的操作:

    configuration.setProperty( Environment.USE_QUERY_CACHE, Boolean.FALSE.toString() );
    configuration.setProperty( Environment.USE_SECOND_LEVEL_CACHE, Boolean.FALSE.toString() );
    configuration.setProperty(Environment.CACHE_REGION_FACTORY,org.hibernate.cache.impl.NoCachingRegionFactory.class.getName());
    configuration.setProperty(Environment.CACHE_PROVIDER,org.hibernate.cache.NoCacheProvider.class.getName());
    

    但是请注意,您不能禁用 Hibernate 提供的会话缓存(如果不是所有 JPA 实现)。如果你真的有东西不被 Hibernate 缓存,你可以驱逐它或不使用 hibernate(以你更简单的为准)

    至于缓存特定实体,我建议您查看 javax.persistence.Cacheable 并了解它是如何为您工作的。

    【讨论】:

    • 您确定没有办法禁用会话缓存吗?看起来很奇怪..如果我想在更改前后比较 DB 对象怎么办?是它使用 evict 的唯一方法吗?
    • 我很确定...当您处理 Hibernate 实体时,您正在处理会话的 对象。在所述实体上调用 Session.get() 应该返回相同的对象句柄(或所述实体的代理)
    【解决方案3】:

    我在网上搜索过,结论是确实不能禁用会话缓存。 这很奇怪。 我自己的解决方案是在我希望清除缓存时使用 session.clear()。

    【讨论】:

    • 不起作用,我已经尝试过 session.clear();仍然直接数据库更新不会出现在休眠状态。如果您发现了其他问题,请告诉我。
    • 为我工作。您也可以尝试关闭并打开新会话。
    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 2011-04-19
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2012-04-29
    • 2015-01-05
    相关资源
    最近更新 更多