繁体   English   中英

SELECT查询不使用缓存

[英]SELECT query not using cache

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

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

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

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

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

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

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

你有什么主意吗?

编辑

我正在使用JPA

如果您不希望Hibernate使用其第一级缓存,则可以触发HQL 之前清除缓存。

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

但是,如果您的作业并行执行,由于数据库的事务隔离,这对您没有帮助。 更多这里这里 在这种情况下,您唯一的选择是将事务隔离级别设置为读取未提交/脏 (我不建议这样做)。

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

entityManager.refresh(entity);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM