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

View File

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