我有一张地图,我想坚持下去。域对象是这样的:
public class Settings {
private String key;
private String value;
public String getKey() { ... }
public String getValue() { ... }
public void setKey(String key) { ... }
public void setValue(String value) { ... }
}
标准方法是为每对生成Setting
,并为saveOrUpdate()
生成update Settings s1 set s1.value = :value1 where s1.key = :key1
s2 set s2.value = :value2 where s2.key = :key2
。但是它会产生太多的查询,因为我需要一次保存大量设置,这确实会影响性能。有没有办法使用一个更新查询来执行此操作?
UPD:好吧,也许有更新多行的hql语法?像
这样的东西{{1}}
答案 0 :(得分:1)
如果每个设置都是表中的一行,则需要发出尽可能多的更新语句。但是要注意的一些事情是
1)将hibernate批量大小调整为20左右,这意味着虽然hibernate发布了20个更新,但它们都是作为批处理发送的(希望一次网络往返提供驱动程序允许批处理)
2)修改dao代码/事务逻辑以批量处理
3)有一个存储过程并传递数组值(我认为hibernate和storedprocs不是好朋友)
答案 1 :(得分:0)
我不知道任何允许多个where语句的语法,就像你写的那样。
确保您正在使用批处理。如果没有激活,请尝试更新。
如果要用于更新“设置”表的值已在其他位置的数据库中,则应该能够执行单个更新。那可能会更快。
如果数据不在数据库中,您可以在执行单个更新查询之前将它们插入临时表中,但是在这里,您将需要sql查询(这可以通过hibernate实现)。
但是单个更新语句可能仍然太慢。最后的解决方案(没有完全重新思考用例的逻辑)我知道的是'select for update'语句。那是原始的jdbc,但是使用Spring JdbcTemplate,它并不那么痛苦。您选择要更新的所有行(如果它使请求更快,您可以选择更多,但在这种情况下,您将对网络资源产生影响,从数据库获取的行数超出需要的数量),然后更新他们在你获取它们时使用jdbc。