From a93cdd68b876234be44e7eede09bde4c3462f23c Mon Sep 17 00:00:00 2001 From: "icksishu@gmail.com" Date: Fri, 5 Dec 2025 12:31:32 +0900 Subject: [PATCH] =?UTF-8?q?CUBRID=20JDBC=20=EB=B2=84=EC=A0=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20CUBRID=20=EC=98=A4=EB=A5=98=20=EB=8C=80=EB=B9=84=20?= =?UTF-8?q?commit,=20rollback,=20connection=20close=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 +- .../datasource/DynamicDataSourceService.java | 5 +- .../config/datasource/SqlExecuteService.java | 54 ++++++++++++++++--- 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index e51966e..3f52b92 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group = 'com.bsmlab.dfx' -version = '1.0.7' +version = '1.0.8' // git commit hash -> application.yml def gitCommitId = '' @@ -59,7 +59,7 @@ dependencies { implementation 'com.oracle.database.jdbc:ojdbc11' implementation 'com.oracle.ojdbc:orai18n:19.3.0.0' implementation 'org.mariadb.jdbc:mariadb-java-client' - implementation 'cubrid:cubrid-jdbc:11.3.0.0047' + implementation 'cubrid:cubrid-jdbc:11.2.1.0040' implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/src/main/java/com/bsmlab/dfx/agent/config/datasource/DynamicDataSourceService.java b/src/main/java/com/bsmlab/dfx/agent/config/datasource/DynamicDataSourceService.java index e8cbea3..3243630 100644 --- a/src/main/java/com/bsmlab/dfx/agent/config/datasource/DynamicDataSourceService.java +++ b/src/main/java/com/bsmlab/dfx/agent/config/datasource/DynamicDataSourceService.java @@ -46,6 +46,8 @@ public class DynamicDataSourceService { } else if(cubrid.jdbc.driver.CUBRIDDriver.class.getCanonicalName().equals(dataSourceConfig.getDriverClassName())) { dataSource.setValidationQuery("SELECT 1 FROM DB_ROOT"); + dataSource.setValidationQueryTimeout(Duration.ofMillis(3)); + dataSource.setDurationBetweenEvictionRuns(Duration.ofMillis(60000)); } dataSource.setEvictionPolicyClassName("org.apache.commons.pool2.impl.DefaultEvictionPolicy"); dataSource.setSoftMinEvictableIdle(Duration.ofSeconds(30)); @@ -84,9 +86,9 @@ public class DynamicDataSourceService { boolean connected = false; try { if(connection.getMetaData().getDriverName().contains("cubrid") || connection.getMetaData().getDriverName().contains("CUBRID")) { - // SELECT 1 FROM DB_ROOT Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT 1 FROM DB_ROOT"); + resultSet.next(); int result = resultSet.getInt(1); if(result == 1) { connected = true; @@ -94,7 +96,6 @@ public class DynamicDataSourceService { else { connected = false; } - } else { connected = connection.isValid(1); 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 047d3d4..b4fee9c 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 @@ -11,6 +11,8 @@ import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; +import java.sql.Connection; +import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -54,37 +56,77 @@ public class SqlExecuteService { dataSourceConfig = config; } } + Map parameter = null; int maximumRowForTransaction = dataSourceConfig == null ? 1000 : dataSourceConfig.getMaximumRowForTransaction(); + DataSourceTransactionManager transactionManager = dynamicDataSourceService.getTransactionManager(dataSourceId); + DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED); + TransactionStatus transactionStatus = transactionManager.getTransaction(defaultTransactionDefinition); + Connection connection = null; if(parameterList.size() > maximumRowForTransaction) { try(SqlSession sqlSession = dynamicDataSourceService.getSqlSession(dataSourceId)) { + connection = sqlSession.getConnection(); for(int i = 0; i < parameterList.size(); i++) { - Map parameter = parameterList.get(i); + parameter = parameterList.get(i); sqlSession.insert(sqlId, parameter); resultParameterList.add(parameter); } - return resultParameterList; + transactionManager.commit(transactionStatus); + } + catch(RuntimeException e) { + log.error("dataSourceId: {}, sqlId: {}, parameters: {}", dataSourceId, sqlId, parameter, e); + try { + transactionManager.rollback(transactionStatus); + } + catch (RuntimeException ex) { + log.warn("Rollback failed", ex); + } + if(connection != null) { + try { + connection.close(); + } catch (SQLException ex) { + log.warn("Failed to close connection after error", ex); + } + } + throw e; } 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.getSqlSession(dataSourceId)) { + connection = sqlSession.getConnection(); for(int i = 0; i < parameterList.size(); i++) { - Map parameter = parameterList.get(i); + parameter = parameterList.get(i); sqlSession.insert(sqlId, parameter); resultParameterList.add(parameter); } transactionManager.commit(transactionStatus); return resultParameterList; } + catch(RuntimeException e) { + log.error("dataSourceId: {}, sqlId: {}, parameters: {}", dataSourceId, sqlId, parameter, e); + try { + transactionManager.rollback(transactionStatus); + } + catch (RuntimeException ex) { + log.warn("Rollback failed", ex); + } + if(connection != null) { + try { + connection.close(); + } + catch (SQLException ex) { + log.warn("Failed to close connection after error", ex); + } + } + throw e; + } finally { dynamicRoutingDataSource.clearDataSource(); } } + return resultParameterList; } public int update(String dataSourceId, String sqlId, Map parameter) {