如何禁用hibernate缓存

Sri*_*vas 27 caching hibernate

我正在尝试编写一个单元测试类,它必须使用相同的查询在同一测试方法中从数据库中获取结果两次.但是,当第二次启用Hibernate缓存时,它实际上并没有访问数据库,只是从缓存中获取结果.

有人可以回答如何禁用缓存persistence.xml.

我试图通过更改属性来禁用 hibernate.cache.use.query_cache = falsehibernate.cache.use_second_level_cache = false.

但它没有用.

Pas*_*ent 20

有人可以回答如何在persistence.xml中禁用缓存.

默认情况下禁用二级缓存和查询缓存(除非您显式缓存查询,否则不会缓存查询).无法禁用第一级缓存.

我尝试通过更改属性禁用(...)

这将禁用二级缓存和查询缓存(如果已启用).

但它没有用.

说实话,"它不起作用"是对当前行为与预期行为的非常糟糕的描述.提供更多细节,(伪)代码,SQL跟踪可能会有所帮助.

话虽这么说,如果问题是关于HQL,HQL查询肯定会在后续执行时命中数据库(没有任何查询缓存).如果需要,请激活SQL日志记录以进行观察.

如果问题是关于Session#get()Session#load(),那么您可以使用Session#refresh()或调用Session#clear()完全清除会话来重新加载实体的状态.

  • 抱歉,但这没有帮助。 (3认同)

Ton*_*ony 9

Hibernate有两级Cache,

  1. 会话缓存(第一级缓存)是默认缓存,没有禁用的机制.

  2. SessionFactory(二级)级缓存:我们必须通过设置cache_provider在Hibernate cfg文件中配置它.

    我需要从DB加载大量数据,因为以下功能,我使用了无状态会话.

     a. Stateless session does not support session cache and never interact with 
        second level cache.
     b. Stateless session does not support automatic dirty check.
     c. Stateless session does not support cascading to associated entities.
    
    Run Code Online (Sandbox Code Playgroud)

    创建无状态会话的语法:

    StatelessSession statelessSession = sessionFactory.openStatelessSession();
    
    Run Code Online (Sandbox Code Playgroud)

  • `entityManager.clear()` 不会清理所谓的一级缓存吗? (3认同)

小智 7

您可以使用:

session.setCacheMode(CacheMode.IGNORE)

在你之后:

session.createQuery("from Table") 声明.

这将确保Hibernate不与此查询返回的任何实体的二级缓存交互.