RED-6270: Changed batch execution to use the batch size provided by the configuration
This commit is contained in:
parent
080014021b
commit
2bc2e48768
@ -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)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -22,7 +22,7 @@ spring:
|
||||
properties:
|
||||
hibernate:
|
||||
jdbc:
|
||||
batch_size: 50
|
||||
batch_size: 1000
|
||||
order_inserts: true
|
||||
order_updates: true
|
||||
cache:
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user