hibernate 休眠禁用缓存

monwx1rj  于 2023-08-06  发布在  其他
关注(0)|答案(4)|浏览(158)

我想禁用休眠缓存。
session.setCacheMode(CacheMode.IGNORE)不工作。
query.setCacheable(false)也不能用。
另外,我是否可以以某种方式配置缓存不会为对象X,Y,但会为对象Z?

  • 谢谢-谢谢
mrwjdhj3

mrwjdhj31#

您可以在从管理器获取可重用会话对象之前调用session.clear()
也就是说,在我们的项目中,我们必须在多个hibernate会话之间同步更新(每个http会话一个)。第二级缓存工作正常,但第一级(每个会话)必须禁用或清除。因此,我们创建了SessionManager,存储所有会话并按需交付。就在交付之前调用session.clear(),这解决了问题。
直到你做你的工作单元-一级缓存是好的。

ubbxdtey

ubbxdtey2#

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

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,看看它是如何为您工作的。

7uhlpewt

7uhlpewt3#

我在网上搜索了一下,结论是会话缓存确实不能被禁用。这很奇怪。我自己的解决方案是当我想清除该高速缓存时使用session.clear()。

2nbm6dog

2nbm6dog4#

如果有人在寻找解决方案时遇到了这个问题,这对我来说是有效的:
我用session.setProperty(AvailableSettings.JPA_SHARED_CACHE_RETRIEVE_MODE, CacheRetrieveMode.BYPASS)代替了session.setCacheMode(CacheMode.IGNORE),它让我在下一个实体加载调用时绕过了二级缓存。

相关问题