@Id @GeneratedValue(generator = "uuid2")
@GenericGenerator(name="uuid2", strategy = "uuid2")
@Column(columnDefinition = "BINARY(16)")
private UUID id;
기본적으로 아이디 채번방식이 SEQUENCE를 제외하면 saveAll을 사용해도 bulkInsert/Update쿼리가 날라가지 않는다.(row갯수만큼 쿼리 요청이 간다) 이는 성능적인 측면에서 I/O가 많이 발생하고 애플리케이션서버에서 감당해야할 부하를 DB서버에서 감당해야하기때문에 좋지않다. 그래서 JPA가 아닌 JdbcTemplate를 사용해서 bulkInsert를 진행하는 방법이 있다.
uuid는 db에 들어갈때 16진수(hex)로 들어가기때문에 조회 쿼리를 다음과 같이 사용한다.
select * from table where id = unhex(replace('2f1c7db8-0012-43b6-b5e8-d2d4bed600a0','-',''));
그렇다면 insert 쿼리또한 다음과 같이 나간다.
INSERT INTO table(id) VALUES (UNHEX(REPLACE('77d521d4-0329-47eb-b644-3d46b6c67b01','-','')));
private final JdbcTemplate jdbcTemplate;
public void batchInsertTable(List<Table> table) {
jdbcTemplate.batchUpdate("INSERT INTO Table (id) VALUES (?)",
new BatchPreparedStatementSetter() {
@Override
public void setValues(@NotNull PreparedStatement ps, int i) throws SQLException {
ps.setBytes(1, DatatypeConverter.parseHexBinary(table.get(i).getId().toString().replace("-", "")));
}
@Override
public int getBatchSize() {
return table.size();
}
});
}