如何禁用hibernate缓存
我正在尝试编写一个单元测试类,它必须使用相同的查询,以相同的测试方法两次从数据库中获取结果。但当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
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有两级缓存
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()
清理所谓的一级缓存?