SELECT查询不使用缓存

时间:2014-02-26 20:48:04

标签: hibernate session caching jpa playframework

在我的Web应用程序中,我有一个执行大量写入查询的工作。这项工作必须非常快,这就是我使用无状态会话的原因。

因此,只要我必须更新或插入实体,我就会使用无状态会话

但是,要检索我的工作中使用的数据,我正在使用普通会话(由 Play Framework 创建的会话),以便加载关系。

这通常工作正常,因为我使用普通会话在作业开头检索数据,然后使用无状态会话更新并插入更改(因此两个会话之间没有冲突)。

但是,我现在遇到了这个解决方案的问题。我有一个实体,我也在从另一份工作中更新。在我的第一份工作中,我需要对该实体进行最后一次更新(我需要在我的工作之间同步这个实体)。因此,当我需要它时,我使用新的 SELECT 查询检索它,但实体不包含上次更新!

我认为这是因为缓存。当使用无状态会话在另一个作业中更新此实体时,正常会话的缓存不会更新,然后当我执行 SELECT 查询以检索上次更新时,我只是获取缓存中的内容(这不是最后一次更新。)

因此,为了解决我的问题,我想知道是否可以使用Hibernate执行 SELECT 查询,而不使用缓存。实际上我想强制Hibernate执行一个新的真正的 SELECT 查询,而不是使用缓存从数据库中检索最后一次更新。

你有什么想法吗?

修改

我正在使用JPA

2 个答案:

答案 0 :(得分:1)

如果您不希望Hibernate使用其第一级缓存,您可以在解雇HQL之前清除缓存

  • 使用Session.evict()从缓存中删除特定实体
  • 使用Session.clear()清除会话的整个第一级缓存

但是,如果您的作业并行执行,由于数据库的事务隔离,这不会帮助您。更多herehere。在这种情况下,您唯一的选择是将事务隔离级别设置为 read uncommitted / dirty (我不建议这样做)。

答案 1 :(得分:1)

要使用JPA从数据库更新实体,我使用了刷新功能,它可以正常工作。

entityManager.refresh(entity);