如何完全禁用Hibernate缓存?(使用Spring 3,带注释的Hibernate)

9
我的Java应用程序每10秒查询一次MySQL服务器。我手动向表中插入新行,但Hibernate无法找到它。
当我手动删除一行时,Hibernate会显示该行存在,我认为这是因为Hibernate缓存导致的。有没有任何方式可以完全禁用它?
3个回答

12
你是指一级缓存还是二级缓存?使用像Ehcache这样的Hibernate二级缓存,可以缓存手动修改的与同一表中行相对应的实体,从而导致你描述的行为。一级缓存不会导致此行为,而且我认为你无法禁用它。
要禁用Hibernate二级缓存,请从Hibernate配置文件hibernate-cfg.xml中删除所有涉及二级缓存的行。例如:
<!-- Enable the second-level cache  -->
<property name="hibernate.cache.provider_class">
    net.sf.ehcache.hibernate.EhCacheProvider
</property>
<property name="hibernate.cache.region.factory_class">
    net.sf.ehcache.hibernate.EhCacheRegionFactory
</property>
<property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_structured_entries">true</property>     
<property name="hibernate.cache.generate_statistics">true</property>

嗨 Derek,谢谢你的回复!嗯,看起来我没有二级缓存,也许尝试删除一级缓存?我该怎么做? - gennad
据我所知,您无法禁用一级缓存,但是根据https://dev59.com/FlHTa4cB1Zd3GeqPPCvN#3946939,Spring可以启用一级缓存的急切刷新,从而有效地实现相同的结果。 - Derek Mahar

2
为了“尝试”禁用一级缓存,我每次请求EntityManager时都会将其清除。对我有用 ;)
public EntityManager getEntityManager(){
        if( emf == null ){
            if (parameters == null) {
                emf = Persistence.createEntityManagerFactory(persistenceUnitName);
            } else {
                emf = Persistence.createEntityManagerFactory(persistenceUnitName, parameters);
            }
        } else {
            emf.getCache().evictAll();
        }

        EntityManager em = emf.createEntityManager();
        return em;
    }

-1

你可以在你的persist方法中使用hints.put("javax.persistence.cache.retrieveMode", CacheRetrieveMode.BYPASS);,这可能会起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接