diff --git a/src/docs/settings-examples/dfxagent-bd-test-cubrid-local.json b/src/docs/settings-examples/dfxagent-bd-test-cubrid-local.json index 26c41fc..8343efa 100644 --- a/src/docs/settings-examples/dfxagent-bd-test-cubrid-local.json +++ b/src/docs/settings-examples/dfxagent-bd-test-cubrid-local.json @@ -19,7 +19,8 @@ "driverClassName": "cubrid.jdbc.driver.CUBRIDDriver", "url": "jdbc:cubrid:14.63.185.105:33000:amif:ami::", "username": "ami", - "password": "fox12#$%" + "password": "fox12#$%", + "maximumRowForTransaction": 1000 } ], "sqlMapperLocations": [ diff --git a/src/main/java/com/bsmlab/dfx/agent/config/AgentConfigDto.java b/src/main/java/com/bsmlab/dfx/agent/config/AgentConfigDto.java index 36f9be9..8be60cc 100644 --- a/src/main/java/com/bsmlab/dfx/agent/config/AgentConfigDto.java +++ b/src/main/java/com/bsmlab/dfx/agent/config/AgentConfigDto.java @@ -40,6 +40,7 @@ public class AgentConfigDto { private String url; private String username; private String password; + private int maximumRowForTransaction; } @Data diff --git a/src/main/java/com/bsmlab/dfx/agent/config/datasource/SqlExecuteService.java b/src/main/java/com/bsmlab/dfx/agent/config/datasource/SqlExecuteService.java index abfc71a..c84873c 100644 --- a/src/main/java/com/bsmlab/dfx/agent/config/datasource/SqlExecuteService.java +++ b/src/main/java/com/bsmlab/dfx/agent/config/datasource/SqlExecuteService.java @@ -1,11 +1,19 @@ package com.bsmlab.dfx.agent.config.datasource; +import com.bsmlab.dfx.agent.config.AgentConfigDto; +import com.bsmlab.dfx.agent.config.AgentConfigReader; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.stereotype.Service; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.DefaultTransactionDefinition; +import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -13,6 +21,7 @@ import java.util.Map; @Service @Slf4j public class SqlExecuteService { + private final AgentConfigReader agentConfigReader; private final DynamicRoutingDataSource dynamicRoutingDataSource; private final DynamicDataSourceService dynamicDataSourceService; @@ -37,6 +46,49 @@ public class SqlExecuteService { } } + public List> insert(String dataSourceId, String sqlId, List> parameterList) { + List> resultParameterList = new ArrayList<>(); + dynamicRoutingDataSource.setDataSource(dataSourceId); + List dataSourceConfigList = agentConfigReader.getAgentConfigDto().getDataSourceConfig(); + AgentConfigDto.DataSourceConfig dataSourceConfig = null; + for(AgentConfigDto.DataSourceConfig config : dataSourceConfigList) { + if(dataSourceId.equals(config.getDataSourceId())) { + dataSourceConfig = config; + } + } + int maximumRowForTransaction = dataSourceConfig == null ? 1000 : dataSourceConfig.getMaximumRowForTransaction(); + if(parameterList.size() > maximumRowForTransaction) { + try(SqlSession sqlSession = dynamicDataSourceService.getSqlSessionFactory(dataSourceId).openSession()) { + for(int i = 0; i < parameterList.size(); i++) { + Map parameter = parameterList.get(i); + sqlSession.insert(sqlId, parameter); + resultParameterList.add(parameter); + } + return resultParameterList; + } + finally { + dynamicRoutingDataSource.clearDataSource(); + } + } + else { + DataSourceTransactionManager transactionManager = dynamicDataSourceService.getTransactionManager(dataSourceId); + DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED); + TransactionStatus transactionStatus = transactionManager.getTransaction(defaultTransactionDefinition); + try(SqlSession sqlSession = dynamicDataSourceService.getSqlSessionFactory(dataSourceId).openSession()) { + for(int i = 0; i < parameterList.size(); i++) { + Map parameter = parameterList.get(i); + sqlSession.insert(sqlId, parameter); + resultParameterList.add(parameter); + } + transactionManager.commit(transactionStatus); + return resultParameterList; + } + finally { + dynamicRoutingDataSource.clearDataSource(); + } + } + } + public int update(String dataSourceId, String sqlId, Map parameter) { dynamicRoutingDataSource.setDataSource(dataSourceId); try(SqlSession sqlSession = dynamicDataSourceService.getSqlSessionFactory(dataSourceId).openSession()) { diff --git a/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxSchedulerService.java b/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxSchedulerService.java index 2a4745e..572b6d3 100644 --- a/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxSchedulerService.java +++ b/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxSchedulerService.java @@ -58,9 +58,10 @@ public class DropBoxSchedulerService { ObjectMapper objectMapper = new ObjectMapper(); List> dataMapList; dataMapList = (List>) objectMapper.readValue(receiveMessageDto.getData(), List.class); - for(Map dataMap : dataMapList) { - sqlExecuteService.insert(dropBox.getDataSourceId(), dropBox.getSqlId(), dataMap); - } + sqlExecuteService.insert(dropBox.getDataSourceId(), dropBox.getSqlId(), dataMapList); +// for(Map dataMap : dataMapList) { +// sqlExecuteService.insert(dropBox.getDataSourceId(), dropBox.getSqlId(), dataMap); +// } } else if(dropBox.getTaskType() == AgentConfigDto.TaskType.RECEIVE_FILE) { // 1.2 파일 수신 메시지 처리