我正在寻找一个JPA解决方案(独立于供应商)来批量执行查询。挑战在于提高性能和线程安全性。
示例查询:
Query query = em.createQuery("select e from Entity e where e.property in :list");
该列表是一个介于1和385000之间的大小的集合。因此,需要批量处理此查询。
最初的天真方法是从原始列表中获取子列表并循环直到完成。这是安全的,并且工作得很好,除了它没有表现。
第二种方法是将列表中的所有内容加载到临时表(永久存在,但用作临时表),然后使用原始查询并与临时表连接。这绝对是高性能的,但不是线程安全的,因为我需要在每个批处理之后清除临时表,并且在临时表中没有任何线程id或类似的东西,它非常不安全(目前正在)。
我真的很感激建议以高效和安全的方式解决这个问题。
由于
答案 0 :(得分:2)
首先,查询不是有效的JPQL,因为它没有select子句。
其次,它应该是where e.property in (:list)
。
你填充临时表的策略对我来说很好。你可以让它包含一个额外的uuid列,并在每次你想要执行这样的查询时生成一个新的UUID:
select e from Entity e, TempEntity temp where e.property = temp.property and temp.uuid = :uuid
delete from TempEntity temp where temp.uuid :uuid