在我的Web应用程序中,我有一个执行大量写入查询的工作。这项工作必须非常快,这就是我使用无状态会话的原因。
因此,只要我必须更新或插入实体,我就会使用无状态会话。
但是,要检索我的工作中使用的数据,我正在使用普通会话(由 Play Framework 创建的会话),以便加载关系。
这通常工作正常,因为我使用普通会话在作业开头检索数据,然后使用无状态会话更新并插入更改(因此两个会话之间没有冲突)。
但是,我现在遇到了这个解决方案的问题。我有一个实体,我也在从另一份工作中更新。在我的第一份工作中,我需要对该实体进行最后一次更新(我需要在我的工作之间同步这个实体)。因此,当我需要它时,我使用新的 SELECT 查询检索它,但实体不包含上次更新!
我认为这是因为缓存。当使用无状态会话在另一个作业中更新此实体时,正常会话的缓存不会更新,然后当我执行 SELECT 查询以检索上次更新时,我只是获取缓存中的内容(这不是最后一次更新。)
因此,为了解决我的问题,我想知道是否可以使用Hibernate执行 SELECT 查询,而不使用缓存。实际上我想强制Hibernate执行一个新的真正的 SELECT 查询,而不是使用缓存从数据库中检索最后一次更新。
你有什么想法吗?
修改
我正在使用JPA
答案 0 :(得分:1)
如果您不希望Hibernate使用其第一级缓存,您可以在解雇HQL之前清除缓存。
Session.evict()
从缓存中删除特定实体Session.clear()
清除会话的整个第一级缓存但是,如果您的作业并行执行,由于数据库的事务隔离,这不会帮助您。更多here和here。在这种情况下,您唯一的选择是将事务隔离级别设置为 read uncommitted / dirty (我不建议这样做)。
答案 1 :(得分:1)
要使用JPA
从数据库更新实体,我使用了刷新功能,它可以正常工作。
entityManager.refresh(entity);