RED-6270: Changed batch execution to use the batch size provided by the configuration

This commit is contained in:
Viktor Seifert 2023-04-28 16:05:13 +02:00
parent 080014021b
commit 2bc2e48768
3 changed files with 23 additions and 17 deletions

View File

@ -16,6 +16,7 @@ import javax.persistence.Table;
import javax.transaction.Transactional;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@ -34,6 +35,8 @@ public class JDBCWriteUtils {
private final JdbcTemplate jdbcTemplate;
private final Environment environment;
@SneakyThrows
@Transactional
@ -43,43 +46,47 @@ public class JDBCWriteUtils {
return;
}
var metadata = getEntityMetadata(entities.get(0));
var metadata = getEntityMetadata(entities.get(0).getClass());
final int batchSize = 500;
jdbcTemplate.batchUpdate(metadata.getSqlStatement(), entities, batchSize, metadata::setValues);
jdbcTemplate.batchUpdate(metadata.getSqlStatement(), entities, getBatchSize(), metadata::setValues);
}
private <T> EntityMetadata getEntityMetadata(T entity) {
private int getBatchSize() {
var existingMetadata = entityMetadataMap.get(entity.getClass());
return environment.getProperty("spring.jpa.properties.hibernate.jdbc.batch_size", int.class, 500);
}
private EntityMetadata getEntityMetadata(Class<?> entityClass) {
var existingMetadata = entityMetadataMap.get(entityClass);
if (existingMetadata != null) {
return existingMetadata;
}
var tableName = getTableName(entity);
var args = getArgs(entity);
var tableName = getTableName(entityClass);
var args = getArgs(entityClass);
var sql = String.format(SQL_TEMPLATE, tableName, String.join(", ", args.keySet()), args.keySet().stream().map(a -> "?").collect(Collectors.joining(", ")));
var metadata = new EntityMetadata(tableName, sql, args);
entityMetadataMap.put(entity.getClass(), metadata);
entityMetadataMap.put(entityClass, metadata);
return metadata;
}
private <T> String getTableName(T entity) {
private String getTableName(Class<?> entityClass) {
var tableAnnot = entity.getClass().getDeclaredAnnotation(Table.class);
var tableAnnot = entityClass.getDeclaredAnnotation(Table.class);
return tableAnnot.name();
}
@SneakyThrows
private <T> Map<String, Method> getArgs(T entity) {
private Map<String, Method> getArgs(Class<?> entityClass) {
var fields = entity.getClass().getDeclaredFields();
var fields = entityClass.getDeclaredFields();
Map<String, Method> entityMethodMap = new LinkedHashMap<>();
for (var field : fields) {
var annotations = field.getDeclaredAnnotations();
@ -87,7 +94,7 @@ public class JDBCWriteUtils {
if (annotation.annotationType().equals(Column.class)) {
var columnAnnotation = (Column) annotation;
var name = StringUtils.isEmpty(columnAnnotation.name()) ? toSnakeCase(field.getName()) : columnAnnotation.name();
entityMethodMap.put(name, entity.getClass().getMethod(getMethodName(field)));
entityMethodMap.put(name, entityClass.getMethod(getMethodName(field)));
}
}
}

View File

@ -22,7 +22,7 @@ spring:
properties:
hibernate:
jdbc:
batch_size: 50
batch_size: 1000
order_inserts: true
order_updates: true
cache:

View File

@ -16,7 +16,6 @@ spring:
scheduler:
instanceId: AUTO
job-store-type: JDBC
main:
allow-circular-references: true # FIXME
jpa:
@ -28,7 +27,7 @@ spring:
properties:
hibernate:
jdbc:
batch_size: 50
batch_size: 1000
order_inserts: true
order_updates: true
open-in-view: true