我想禁用休眠缓存。session.setCacheMode(CacheMode.IGNORE)不工作。query.setCacheable(false)也不能用。另外,我是否可以以某种方式配置缓存不会为对象X,Y,但会为对象Z?
session.setCacheMode(CacheMode.IGNORE)
query.setCacheable(false)
mrwjdhj31#
您可以在从管理器获取可重用会话对象之前调用session.clear()。也就是说,在我们的项目中,我们必须在多个hibernate会话之间同步更新(每个http会话一个)。第二级缓存工作正常,但第一级(每个会话)必须禁用或清除。因此,我们创建了SessionManager,存储所有会话并按需交付。就在交付之前调用session.clear(),这解决了问题。直到你做你的工作单元-一级缓存是好的。
session.clear()
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,看看它是如何为您工作的。
7uhlpewt3#
我在网上搜索了一下,结论是会话缓存确实不能被禁用。这很奇怪。我自己的解决方案是当我想清除该高速缓存时使用session.clear()。
2nbm6dog4#
如果有人在寻找解决方案时遇到了这个问题,这对我来说是有效的:我用session.setProperty(AvailableSettings.JPA_SHARED_CACHE_RETRIEVE_MODE, CacheRetrieveMode.BYPASS)代替了session.setCacheMode(CacheMode.IGNORE),它让我在下一个实体加载调用时绕过了二级缓存。
session.setProperty(AvailableSettings.JPA_SHARED_CACHE_RETRIEVE_MODE, CacheRetrieveMode.BYPASS)
4条答案
按热度按时间mrwjdhj31#
您可以在从管理器获取可重用会话对象之前调用
session.clear()
。也就是说,在我们的项目中,我们必须在多个hibernate会话之间同步更新(每个http会话一个)。第二级缓存工作正常,但第一级(每个会话)必须禁用或清除。因此,我们创建了SessionManager,存储所有会话并按需交付。就在交付之前调用
session.clear()
,这解决了问题。直到你做你的工作单元-一级缓存是好的。
ubbxdtey2#
在配置hibernate会话工厂时尝试类似的操作:
字符串
但是请注意,您不能禁用Hibernate提供的会话缓存(如果不是所有JPA实现)。如果你真的有什么东西不想被Hibernate缓存,你可以把它驱逐出去或者不使用Hibernate(无论哪个对你来说更简单)
至于缓存特定的实体,我建议您查看javax.persistence.Cacheable,看看它是如何为您工作的。
7uhlpewt3#
我在网上搜索了一下,结论是会话缓存确实不能被禁用。这很奇怪。我自己的解决方案是当我想清除该高速缓存时使用session.clear()。
2nbm6dog4#
如果有人在寻找解决方案时遇到了这个问题,这对我来说是有效的:
我用
session.setProperty(AvailableSettings.JPA_SHARED_CACHE_RETRIEVE_MODE, CacheRetrieveMode.BYPASS)
代替了session.setCacheMode(CacheMode.IGNORE)
,它让我在下一个实体加载调用时绕过了二级缓存。