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();