禁用hibernate缓存



我已经发现在SO上有很多关于缓存和休眠的问题,但是我找不到解决问题的方法。大多数问题都是直接使用hibernate而不使用JPA。

我们使用Spring, Hibernate配置为JPA提供者。应用程序本身是一个使用JSF的web应用程序。底层数据库为SQL Server 2008。

根据jpa规范,我们向persistence.xml添加了以下内容。

<shared-cache-mode>NONE</shared-cache-mode>

Hibernate似乎或多或少忽略了它。Hibernate文档告诉我们,这将禁用第二级缓存。然而,我们的应用程序需要从数据库中获取最新的数据,因为第三个应用程序将在每隔一段时间更改一些数据。

如何禁用缓存?我们通过如下查询以JPA方式获取数据:

@PersistenceContext(type=PersistenceContextType.EXTENDED)
private EntityManager em;
...
return em.createQuery("SELECT mt FROM " + MyTable.class.getSimpleName() + " mt",
                      MyTable.class).getResultList();

@axtavt 我启动了应用程序,并在浏览器中加载了一个查询该表的页面。我切换到我的DBMS并对表进行更新。我打开第二个浏览器,它仍然显示旧的数据,而不是更新的数据。

我做了进一步的测试我用的是@PersistenceContextEXTENDED。我把它加在这里。如果我把它去掉它就能正常工作但是我遇到了不同的问题然后。

在hibernate中,他们称之为二级缓存,因为hibernate会话本身就是一级缓存。会话(持久化上下文)通常在一个@Transactional方法的持续时间内缓存对象,只是为了确保正确维护对象关系。

在您的用例中,禁用第二级缓存是您需要的。在请求期间,您可能想要一致的数据,但在请求之间,没有缓存,因此对于下一个请求,所有数据都是新鲜的。

似乎您的事务尚未提交,因此其他浏览器仍然看到旧数据。

我以前从未使用过EXTENDED解决方案,但据我所知,当使用EXTENDED时,您必须提交长时间运行的事务,以便其他事务能够看到结果。查看在使用EXTENDED持久化上下文类型时如何提交事务。

我做了一些进一步的测试。我使用@PersistenceContextEXTENDED。我把它加到主帖子里了。如果我删除扩展刷新工作。然而,我遇到了不同的问题,然后…

最新更新