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 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)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user