JPA2.0:批量查询,安全和性能?
我正在寻找一个JPA解决方案(独立于供应商)来批量执行查询。挑战在于使其性能和线程安全 查询示例:JPA2.0:批量查询,安全和性能?,jpa,jpa-2.0,Jpa,Jpa 2.0,我正在寻找一个JPA解决方案(独立于供应商)来批量执行查询。挑战在于使其性能和线程安全 查询示例: Query query = em.createQuery("select e from Entity e where e.property in :list"); 该列表是一个大小介于1和385000之间的集合。因此,需要批处理此查询 最初的天真方法是从原始列表中获取一个子列表并循环直到完成。这是安全的,工作良好,除了它没有性能 第二种方法是将列表中的所有内容加载到临时表(永久存在,但用作临时表
Query query = em.createQuery("select e from Entity e where e.property in :list");
该列表是一个大小介于1和385000之间的集合。因此,需要批处理此查询
最初的天真方法是从原始列表中获取一个子列表并循环直到完成。这是安全的,工作良好,除了它没有性能
第二种方法是将列表中的所有内容加载到临时表(永久存在,但用作临时表),然后使用原始查询并与临时表联接。这当然是有性能的,但不是线程安全的,因为我需要在每次批处理之后清除temp表,并且temp表中没有任何线程id或类似的东西,这是非常不安全的(目前)
我非常感谢大家提出建议,以达成一个性能和安全的方式来解决这个问题
谢谢首先,该查询不是有效的JPQL,因为它没有select子句 其次,它应该是(:list)中e.property所在的
我觉得你填充临时表的策略很好。您可以让它包含一个额外的uuid列,并在每次执行此类查询时生成一个新的uuid:
- 生成UUID
- 在表中插入列表的所有元素,将uuid列设置为生成的uuid
- 执行一个查询,例如
从实体e中选择e,TempEntity temp,其中e.property=temp.property和temp.uuid=:uuid
- 执行查询以删除临时表中的所有行(并非绝对必要):
delete from TempEntity temp where temp.uuid:uuid
独立于供应商意味着更改您的查询(添加“选择e”),因为这不是您提供的JPQL。发布实体类。谢谢大家。把查询搞错了一点,我们会修改它们以确保它看起来是正确的。谢谢。我刚刚想到了UUID,并得到了您的验证:)非常确定它应该是“in:list”,“in(:list)”是一个包含一个元素的列表,也就是说,“in(:arg1,:ag2)”是一个包含两个元素的列表,“in(:arg1)”=>“in(4)”如果arg是4。@James:您说得对。我习惯于Hibernate,直到最近,括号在Hibernate JPQL查询中还是必需的。看见