업무 간 PostgreSQL + jooq 로 batch upsert 작업을 해야할 일이 생겼다.
처음엔 작업량을 고려하지 못하고 일일히 커넥션이 발생하는 형태였으나 아래 링크를 참고하여 해결하였다.
https://stackoverflow.com/questions/62870572/how-to-batch-update-using-jooq
How to batch update using jooq
Using the following way to update using jOOQ. for (Balance balance : balances) { dslContext.update(BALANCE) .set(BALANCE.AMOUNT, balance.getAmount()) .where(
stackoverflow.com
@Transactional
override suspend fun update(parts: List<Part>) {
val updates: MutableList<InsertOnDuplicateSetMoreStep<PartsRecord>> = mutableListOf()
parts.map { part ->
updates.add(
dsl.insertInto(PARTS)
.columns(PARTS.ID, PARTS.PW, PARTS.DESCRIPTION)
.values(part.id, part.pw, part.description)
.onConflictOnConstraint(PARTS.uniqueKeys.single())
.doUpdate()
.set(PARTS.DESCRIPTION, part.description)
)
}
databaseClient.procedure {
batch(updates)
}.singleOrNull()
}
upsert의 경우
insertInto ~ columns ~ values ~ onConflictOnConstraint ~ doUpdate ~ set 방식으로 진행하였다.
batch의 경우
upsert 쿼리를 리스트에 담고 dslcontext의 batch로 실행시키기 (예제에선 커스텀 함수를 사용하였음)