From 2bc2e487682e02579b06af7441d2c1c4ace82cf2 Mon Sep 17 00:00:00 2001 From: Viktor Seifert Date: Fri, 28 Apr 2023 16:05:13 +0200 Subject: [PATCH] RED-6270: Changed batch execution to use the batch size provided by the configuration --- .../processor/utils/jdbc/JDBCWriteUtils.java | 35 +++++++++++-------- .../src/main/resources/application.yml | 2 +- .../src/test/resources/application.yml | 3 +- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCWriteUtils.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCWriteUtils.java index 8c6449035..7c71a2a32 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCWriteUtils.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCWriteUtils.java @@ -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 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 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 Map getArgs(T entity) { + private Map getArgs(Class entityClass) { - var fields = entity.getClass().getDeclaredFields(); + var fields = entityClass.getDeclaredFields(); Map 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))); } } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yml index b8771cbb0..fc2e39edd 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yml +++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yml @@ -22,7 +22,7 @@ spring: properties: hibernate: jdbc: - batch_size: 50 + batch_size: 1000 order_inserts: true order_updates: true cache: diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml b/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml index 87063e89f..d61dfe710 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml +++ b/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml @@ -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