【发布时间】:2018-09-14 12:51:25
【问题描述】:
使用 JOOQ 进行批量更新的正确方法是什么?
我有以下几点:
public void updateScores(Map<String, Integer> teamScores) {
writeContext().transaction(config -> {
DSLContext dslContext = DSL.using(config);
dslContext.batchUpdate(Maps.transformEntries(teamScores, (id, score) -> {
TeamScoresRecord record = new TeamScoresRecord();
record.setTeamId(id);
record.setScore(score);
return record;
}).values()).execute();
});
}
或
public void updateScores(Map<String, Integer> teamScores) {
writeContext().transaction(config -> {
DSLContext dslContext = DSL.using(config);
dslContext.batchUpdate(
dslContext.selectFrom(TEAM_SCORES)
.where(TEAM_SCORES.TEAM_ID.in(teamScores.keySet()))
.forUpdate()
.fetch()
.stream()
.peek(record -> record.setScore(teamScores.get(record.getTeamId())))
.collect(Collectors.toList())
).execute();
});
}
建议使用以下哪种方式进行批量更新?
【问题讨论】:
-
Current;y 我发现第一个有效,第二个无效。我的意思是第一个实际上更新了行,但第二个并没有,因为在此之后进行选择会产生与更新前相同的行
-
好奇:为什么你在第二个例子中使用
peek(),而不是map()?另外,你的地图有多大? -
@LukasEder
TableRecord::set方法返回 void,并就地修改记录,因此由于 void 使用 map 会出错,但使用 peek 可以工作,因为该项目已就地修改。地图通常是 10k-15k 元素左右 -
好的,我明白了。还有
Record::with,以防万一,或者你可以在代码生成器中生成流畅的setter。我稍后会研究这个问题 -
恐怕无法用第二种方法重现问题。
标签: java mysql java-8 batch-processing jooq