如何禁用hibernate缓存

如何禁用hibernate缓存,hibernate,caching,Hibernate,Caching,我正在尝试编写一个单元测试类,它必须使用相同的查询,以相同的测试方法两次从数据库中获取结果。但当Hibernate缓存第二次启用时,它实际上并没有命中数据库,只是从缓存中获取结果 有人能回答一下如何在persistence.xml中禁用缓存吗 我试图通过更改属性hibernate.cache.use.query\u cache=false和hibernate.cache.use\u second\u level\u cache=false来禁用 但它没有起作用 有人能回答一下如何在persist

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

有人能回答一下如何在
persistence.xml
中禁用缓存吗

我试图通过更改属性
hibernate.cache.use.query\u cache=false
hibernate.cache.use\u second\u level\u cache=false
来禁用

但它没有起作用

有人能回答一下如何在persistence.xml中禁用缓存吗

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

我试图通过更改属性来禁用(…)

如果启用了二级缓存和查询缓存,则会禁用它们

但它没有起作用

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

也就是说,如果问题是关于HQL的,那么HQL查询肯定会在后续执行时命中数据库(没有任何查询缓存)。如果需要,请激活SQL日志记录以观察此情况


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

据hibenrate团队的一名成员说:

第二级缓存不需要任何东西 进行第一级(会话或 持久性(上下文)缓存。这个 持久性上下文/会话缓存不可用 由于各种原因,这是强制性的。在里面 事实上,不了解这一点至关重要 在应用程序中忽略它 建筑是灾难的秘诀。 这里没有快速的解决方案,学习 一些文件

资料来源:https://forum.hibernate.org/viewtopic.php?p=2383408
在重试同一查询之前,您可以使用seision.execute(您的对象)。

使用无状态会话:

您可以使用:

session.setCacheMode(CacheMode.IGNORE)

在您的

session.createQuery(“来自表”)
语句


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

如果在单元测试中创建新(不同)会话,它将“不”使用旧会话的缓存。或者,如果先对其调用clear()(另一个选项),等等。

Hibernate有两级缓存

  • 会话缓存(一级缓存)是默认缓存,并且没有可禁用的机制

  • SessionFactory(第二级)级别缓存:我们必须在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.
    
    创建无状态会话的语法:

    StatelessSession statelessSession = sessionFactory.openStatelessSession();
    

  • 第一次查询结果后,请调用session.clear,然后相同的查询将命中数据库而不是1级缓存

    是否尝试在同一会话中完成这两次读取?如果是这样,则一级缓存会出现这种行为。如果没有看到您的测试用例,很难给您一个准确的答案抱歉,但这没有帮助。是否
    entityManager.clear()
    清理所谓的一级缓存?