This is an automated email from the ASF dual-hosted git repository.

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new dd423282fa4 Auto clear cached connections in (#35834)
dd423282fa4 is described below

commit dd423282fa4e8dd597584cd4f0886b320d55d3a3
Author: Raigor <[email protected]>
AuthorDate: Sun Jun 29 12:42:15 2025 +0800

    Auto clear cached connections in (#35834)
    
    DriverDatabaseConnectionManager, to avoid long-term IN USE of physical 
connections
---
 .../jdbc/adapter/AbstractStatementAdapter.java     | 18 +++++++++++++++-
 .../DriverDatabaseConnectionManager.java           | 24 +++++++++++++++++-----
 .../statement/ShardingSpherePreparedStatement.java | 13 +++---------
 .../core/statement/ShardingSphereStatement.java    |  9 +-------
 4 files changed, 40 insertions(+), 24 deletions(-)

diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractStatementAdapter.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractStatementAdapter.java
index 6ac1b14a4ea..0fc232df36f 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractStatementAdapter.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractStatementAdapter.java
@@ -27,6 +27,8 @@ import 
org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
+import org.apache.shardingsphere.transaction.util.AutoCommitUtils;
 
 import java.sql.Connection;
 import java.sql.SQLException;
@@ -54,6 +56,18 @@ public abstract class AbstractStatementAdapter extends 
WrapperAdapter implements
     
     private boolean closed;
     
+    protected final void handleAutoCommitBeforeExecution(final SQLStatement 
sqlStatement, final ShardingSphereConnection connection) throws SQLException {
+        if (AutoCommitUtils.needOpenTransaction(sqlStatement)) {
+            connection.beginTransactionIfNeededWhenAutoCommitFalse();
+        }
+    }
+    
+    protected final void handleAutoCommitAfterExecution(final 
ShardingSphereConnection connection) throws SQLException {
+        if (connection.getAutoCommit()) {
+            connection.getDatabaseConnectionManager().clearCachedConnections();
+        }
+    }
+    
     protected final void handleExceptionInTransaction(final 
ShardingSphereConnection connection, final ShardingSphereMetaData metaData) {
         if 
(connection.getDatabaseConnectionManager().getConnectionContext().getTransactionContext().isInTransaction())
 {
             DatabaseType databaseType = 
metaData.getDatabase(connection.getCurrentDatabaseName()).getProtocolType();
@@ -222,7 +236,9 @@ public abstract class AbstractStatementAdapter extends 
WrapperAdapter implements
                 getStatementManager().close();
                 Connection connection = getConnection();
                 if (connection instanceof ShardingSphereConnection) {
-                    ((ShardingSphereConnection) 
connection).getStatementManagers().remove(getStatementManager());
+                    ShardingSphereConnection logicalConnection = 
(ShardingSphereConnection) connection;
+                    
logicalConnection.getStatementManagers().remove(getStatementManager());
+                    handleAutoCommitAfterExecution(logicalConnection);
                 }
             }
         } finally {
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java
index c074c4947c1..c583e38a81a 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java
@@ -101,12 +101,28 @@ public final class DriverDatabaseConnectionManager 
implements DatabaseConnection
     public void setAutoCommit(final boolean autoCommit) throws SQLException {
         methodInvocationRecorder.record("setAutoCommit", connection -> 
connection.setAutoCommit(autoCommit));
         forceExecuteTemplate.execute(getCachedConnections(), connection -> 
connection.setAutoCommit(autoCommit));
+        if (autoCommit) {
+            clearCachedConnections();
+        }
     }
     
     private Collection<Connection> getCachedConnections() {
         return cachedConnections.values();
     }
     
+    /**
+     * Clear cached connections.
+     *
+     * @throws SQLException SQL exception
+     */
+    public void clearCachedConnections() throws SQLException {
+        try {
+            forceExecuteTemplate.execute(cachedConnections.values(), 
Connection::close);
+        } finally {
+            cachedConnections.clear();
+        }
+    }
+    
     /**
      * Begin transaction.
      *
@@ -142,6 +158,7 @@ public final class DriverDatabaseConnectionManager 
implements DatabaseConnection
                 
ConnectionSavepointManager.getInstance().transactionFinished(each);
             }
             connectionContext.close();
+            clearCachedConnections();
         }
     }
     
@@ -164,6 +181,7 @@ public final class DriverDatabaseConnectionManager 
implements DatabaseConnection
                 
ConnectionSavepointManager.getInstance().transactionFinished(each);
             }
             connectionContext.close();
+            clearCachedConnections();
         }
     }
     
@@ -382,10 +400,6 @@ public final class DriverDatabaseConnectionManager 
implements DatabaseConnection
     
     @Override
     public void close() throws SQLException {
-        try {
-            forceExecuteTemplate.execute(cachedConnections.values(), 
Connection::close);
-        } finally {
-            cachedConnections.clear();
-        }
+        clearCachedConnections();
     }
 }
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index 7428d6b9e7b..20a110608bf 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -51,7 +51,6 @@ import 
org.apache.shardingsphere.infra.rule.attribute.resoure.StorageConnectorRe
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import org.apache.shardingsphere.transaction.util.AutoCommitUtils;
 
 import java.sql.ParameterMetaData;
 import java.sql.PreparedStatement;
@@ -168,7 +167,7 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
             }
             clearPrevious();
             QueryContext queryContext = createQueryContext();
-            
handleAutoCommit(queryContext.getSqlStatementContext().getSqlStatement());
+            
handleAutoCommitBeforeExecution(queryContext.getSqlStatementContext().getSqlStatement(),
 connection);
             findGeneratedKey().ifPresent(optional -> 
generatedValues.addAll(optional.getGeneratedValues()));
             currentResultSet =
                     driverExecutorFacade.executeQuery(usedDatabase, metaData, 
queryContext, this, columnLabelAndIndexMap, 
(StatementAddCallback<PreparedStatement>) this::addStatements, this::replay);
@@ -187,12 +186,6 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
         }
     }
     
-    private void handleAutoCommit(final SQLStatement sqlStatement) throws 
SQLException {
-        if (AutoCommitUtils.needOpenTransaction(sqlStatement)) {
-            connection.beginTransactionIfNeededWhenAutoCommitFalse();
-        }
-    }
-    
     private void addStatements(final Collection<PreparedStatement> statements, 
final Collection<List<Object>> parameterSets) {
         this.statements.addAll(statements);
         this.parameterSets.addAll(parameterSets);
@@ -211,7 +204,7 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
             }
             clearPrevious();
             QueryContext queryContext = createQueryContext();
-            
handleAutoCommit(queryContext.getSqlStatementContext().getSqlStatement());
+            
handleAutoCommitBeforeExecution(queryContext.getSqlStatementContext().getSqlStatement(),
 connection);
             int result = driverExecutorFacade.executeUpdate(usedDatabase, 
metaData, queryContext,
                     (sql, statement) -> ((PreparedStatement) 
statement).executeUpdate(), (StatementAddCallback<PreparedStatement>) 
this::addStatements, this::replay);
             findGeneratedKey().ifPresent(optional -> 
generatedValues.addAll(optional.getGeneratedValues()));
@@ -235,7 +228,7 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
             }
             clearPrevious();
             QueryContext queryContext = createQueryContext();
-            
handleAutoCommit(queryContext.getSqlStatementContext().getSqlStatement());
+            
handleAutoCommitBeforeExecution(queryContext.getSqlStatementContext().getSqlStatement(),
 connection);
             boolean result = driverExecutorFacade.execute(usedDatabase, 
metaData, queryContext, (sql, statement) -> ((PreparedStatement) 
statement).execute(),
                     (StatementAddCallback<PreparedStatement>) 
this::addStatements, this::replay);
             findGeneratedKey().ifPresent(optional -> 
generatedValues.addAll(optional.getGeneratedValues()));
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index 77e79d4e395..974b9bf2243 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -48,7 +48,6 @@ import 
org.apache.shardingsphere.infra.rule.attribute.datanode.DataNodeRuleAttri
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import org.apache.shardingsphere.transaction.util.AutoCommitUtils;
 
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -263,7 +262,7 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
     }
     
     private void prepareExecute(final QueryContext queryContext) throws 
SQLException {
-        
handleAutoCommit(queryContext.getSqlStatementContext().getSqlStatement());
+        
handleAutoCommitBeforeExecution(queryContext.getSqlStatementContext().getSqlStatement(),
 connection);
         sqlStatementContext = queryContext.getSqlStatementContext();
         ShardingSpherePreconditions.checkNotNull(sqlStatementContext, () -> 
new IllegalStateException("Statement context can not be null"));
         usedDatabaseName = 
sqlStatementContext.getTablesContext().getDatabaseName().orElse(connection.getCurrentDatabaseName());
@@ -271,12 +270,6 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
         clearStatements();
     }
     
-    private void handleAutoCommit(final SQLStatement sqlStatement) throws 
SQLException {
-        if (AutoCommitUtils.needOpenTransaction(sqlStatement)) {
-            connection.beginTransactionIfNeededWhenAutoCommitFalse();
-        }
-    }
-    
     private void clearStatements() throws SQLException {
         for (Statement each : statements) {
             each.close();

Reply via email to