缓存分为两个级别:
- 第一级是EntityManager自己的缓存。
你可以refresh在一个实体上将其从数据库中重新加载,也可以clear在实体管理器本身中使用,在这种情况下,将从缓存中删除所有实体。JPA无法从缓存中逐出一个特定实体。根据你使用的实现,你可以执行此操作,例如Hibernate的evict方法。
- 2级缓存是全局缓存。
JPA 1.0不提供对第二级缓存的支持。然后,你需要依赖于基础的特定实现或禁用它。JPA 2.0将通过@Cache注释和缓存API 解决此问题。你可以使用特定于Hibernate的API清除二级缓存,例如SessionFactory.evict(…)。
不了解的Hibernate 2级缓存
缓存的高级问题是:
- Query cache
某些查询的结果可以被缓存。再次在JPA 1.0中不支持它,但是大多数实现都有指定将要缓存哪个查询以及如何缓存的方法。
了解Hibernate中的查询缓存
Clustering
然后还有一个麻烦的问题,就是在集群中的节点之间同步缓存。在这种情况下,这主要取决于所使用的缓存技术,例如JBoss缓存。
你的问题仍然是通用的,答案将取决于你的实际工作。
我在一个系统上工作,无需进行hibernate即可完成许多更新,最后我们禁用了第二级缓存。
但是你也可以跟踪所有打开的会话,并在必要时驱逐所有打开的会话的所有第一级缓存以及第二级缓存。你仍然需要自己管理同步,但是我想这是可能的。



