JPA 2.0:批量查询,安全且高效?

时间:2012-02-29 10:31:42

标签: jpa jpa-2.0

我正在寻找一个JPA解决方案(独立于供应商)来批量执行查询。挑战在于提高性能和线程安全性。

示例查询:

Query query = em.createQuery("select e from Entity e where e.property in :list");

该列表是一个介于1和385000之间的大小的集合。因此,需要批量处理此查询。

最初的天真方法是从原始列表中获取子列表并循环直到完成。这是安全的,并且工作得很好,除了它没有表现。

第二种方法是将列表中的所有内容加载到临时表(永久存在,但用作临时表),然后使用原始查询并与临时表连接。这绝对是高性能的,但不是线程安全的,因为我需要在每个批处理之后清除临时表,并且在临时表中没有任何线程id或类似的东西,它非常不安全(目前正在)。

我真的很感激建议以高效和安全的方式解决这个问题。

由于

1 个答案:

答案 0 :(得分:2)

首先,查询不是有效的JPQL,因为它没有select子句。

其次,它应该是where e.property in (:list)

你填充临时表的策略对我来说很好。你可以让它包含一个额外的uuid列,并在每次你想要执行这样的查询时生成一个新的UUID:

  • 生成UUID
  • 在表格中插入列表的所有元素,并将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