카테고리 없음

[jooq] jooq batch 활용하기 (+upsert)

Mussyan 2022. 4. 4. 16:20

업무 간 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로 실행시키기 (예제에선 커스텀 함수를 사용하였음)