【发布时间】:2013-07-10 04:08:29
【问题描述】:
我发现 JPA 不支持以下更新:
Update Person p set p.name = :name_1 where p.id = :id_1,
p.name = :name_2 where p.id = :id_2,
p.name = :name_3 where p.id = :id_3
....
// It could go on, depending on the size of the input. Could be in 100s
所以我有两个选择:
选项 1:
Query q = em.createQuery("Update Person p set p.name = :name where p.id = :id");
For ( int x=0; PersonsList.length; x++ ) {
// add name and id parameters
em.executeUpdate();
}
问题:
- 这就是批量更新所需的全部内容吗?还有什么我需要补充的吗?
我设置
hibernate.jdbc.batch_size", "20" - 这里是否默认开启了乐观锁? (虽然我的实体中没有@Version)
- 如果不是@Version,我需要做什么才能强制执行乐观锁定?
选项 2:
使用Select Case 语法或Criteria API 构造一个查询
问题:
- 批处理是否仍然在这里进行? (在一个大查询中)
- 就性能而言,这是否比第一种方法更好?
- 这两个选项中推荐的方法是什么?还有其他更好的方法吗?
【问题讨论】:
-
来吧,你真的想批量运行 3 行吗? bulk 导致目标表上的 Intent 锁定,效果不好,只需通过
em.begin()开始批处理并调用每个 DML,最后调用 'em.commit();' -
没有。它的动态。我刚刚在示例中展示了 3 :-)。可能是 100 秒。
-
它依赖哥们,你用什么样的数据库?以及您希望多久运行一次此类查询?但如果你问我我更喜欢 DB 更喜欢的方式,并以低优先级并行运行它
-
我们使用 Oracle。它是一个 Web 服务调用。
-
好吧,伙计,它会自动设置批量大小,当您将其设置为 20 时,每个批次将有 20 次调用,但不建议用于重负载,通常
batch_size值为在 10 到 35 之间(受抚养人),对于非常重的负载,使用 db 首选方式 :)
标签: java hibernate hql where jpql