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 4c2d2828c0e Refactor DatabaseConnector (#32439)
4c2d2828c0e is described below
commit 4c2d2828c0e93e0576fe829642a33b38d477119d
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Aug 9 14:58:18 2024 +0800
Refactor DatabaseConnector (#32439)
---
.../proxy/backend/connector/DatabaseConnector.java | 48 ++++++++--------------
1 file changed, 18 insertions(+), 30 deletions(-)
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
index ad377f30f56..296ae5d9510 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
@@ -154,18 +154,11 @@ public final class DatabaseConnector implements
DatabaseBackendHandler {
cachedResultSets.add(resultSet);
}
- /**
- * Execute to database.
- *
- * @return backend response
- * @throws SQLException SQL exception
- */
@Override
public ResponseHeader execute() throws SQLException {
MetaDataContexts metaDataContexts =
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
if (proxySQLExecutor.getSqlFederationEngine().decide(queryContext,
metaDataContexts.getMetaData().getGlobalRuleMetaData())) {
- ResultSet resultSet = doExecuteFederation(queryContext,
metaDataContexts);
- return processExecuteFederation(resultSet, metaDataContexts);
+ return
processExecuteFederation(doExecuteFederation(metaDataContexts),
metaDataContexts);
}
MetaDataRefreshEngine metaDataRefreshEngine =
getMetaDataRefreshEngine();
if (proxySQLExecutor.getSqlFederationEngine().enabled() &&
metaDataRefreshEngine.isFederation(queryContext.getSqlStatementContext())) {
@@ -180,8 +173,8 @@ public final class DatabaseConnector implements
DatabaseBackendHandler {
private ExecutionContext generateExecutionContext() {
ShardingSphereMetaData metaData =
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData();
- return new KernelProcessor().generateExecutionContext(queryContext,
metaData.getGlobalRuleMetaData(), metaData.getProps(),
-
databaseConnectionManager.getConnectionSession().getConnectionContext());
+ return new KernelProcessor().generateExecutionContext(
+ queryContext, metaData.getGlobalRuleMetaData(),
metaData.getProps(),
databaseConnectionManager.getConnectionSession().getConnectionContext());
}
private boolean isNeedImplicitCommitTransaction(final SQLStatement
sqlStatement, final boolean multiExecutionUnits) {
@@ -190,10 +183,7 @@ public final class DatabaseConnector implements
DatabaseBackendHandler {
}
TransactionType transactionType =
TransactionUtils.getTransactionType(databaseConnectionManager.getConnectionSession().getConnectionContext().getTransactionContext());
TransactionStatus transactionStatus =
databaseConnectionManager.getConnectionSession().getTransactionStatus();
- if (!TransactionType.isDistributedTransaction(transactionType) ||
transactionStatus.isInTransaction()) {
- return false;
- }
- return isWriteDMLStatement(sqlStatement) && multiExecutionUnits;
+ return multiExecutionUnits &&
TransactionType.isDistributedTransaction(transactionType) &&
!transactionStatus.isInTransaction() && isWriteDMLStatement(sqlStatement);
}
private boolean isWriteDMLStatement(final SQLStatement sqlStatement) {
@@ -230,7 +220,7 @@ public final class DatabaseConnector implements
DatabaseBackendHandler {
: processExecuteUpdate(result.stream().map(each ->
(UpdateResult) each).collect(Collectors.toList()));
}
- private ResultSet doExecuteFederation(final QueryContext queryContext,
final MetaDataContexts metaDataContexts) {
+ private ResultSet doExecuteFederation(final MetaDataContexts
metaDataContexts) {
boolean isReturnGeneratedKeys =
queryContext.getSqlStatementContext().getSqlStatement() instanceof
MySQLInsertStatement;
ShardingSphereDatabase database =
metaDataContexts.getMetaData().getDatabase(databaseConnectionManager.getConnectionSession().getUsedDatabaseName());
DatabaseType protocolType = database.getProtocolType();
@@ -291,8 +281,8 @@ public final class DatabaseConnector implements
DatabaseBackendHandler {
private MetaDataRefreshEngine getMetaDataRefreshEngine() {
ContextManager contextManager =
ProxyContext.getInstance().getContextManager();
- return new
MetaDataRefreshEngine(contextManager.getPersistServiceFacade().getMetaDataManagerPersistService(),
queryContext.getUsedDatabase(),
- contextManager.getMetaDataContexts().getMetaData().getProps());
+ return new MetaDataRefreshEngine(
+
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService(),
queryContext.getUsedDatabase(),
contextManager.getMetaDataContexts().getMetaData().getProps());
}
private QueryResponseHeader processExecuteQuery(final SQLStatementContext
sqlStatementContext, final List<QueryResult> queryResults, final QueryResult
queryResultSample) throws SQLException {
@@ -327,8 +317,8 @@ public final class DatabaseConnector implements
DatabaseBackendHandler {
private MergedResult mergeQuery(final SQLStatementContext
sqlStatementContext, final List<QueryResult> queryResults) throws SQLException {
ShardingSphereMetaData metaData =
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData();
- MergeEngine mergeEngine =
- new MergeEngine(metaData.getGlobalRuleMetaData(),
queryContext.getUsedDatabase(), metaData.getProps(),
databaseConnectionManager.getConnectionSession().getConnectionContext());
+ MergeEngine mergeEngine = new MergeEngine(
+ metaData.getGlobalRuleMetaData(),
queryContext.getUsedDatabase(), metaData.getProps(),
databaseConnectionManager.getConnectionSession().getConnectionContext());
return mergeEngine.merge(queryResults, sqlStatementContext);
}
@@ -336,22 +326,20 @@ public final class DatabaseConnector implements
DatabaseBackendHandler {
Optional<GeneratedKeyContext> generatedKeyContext =
queryContext.getSqlStatementContext() instanceof InsertStatementContext
? ((InsertStatementContext)
queryContext.getSqlStatementContext()).getGeneratedKeyContext()
: Optional.empty();
- Collection<Comparable<?>> autoIncrementGeneratedValues =
-
generatedKeyContext.filter(GeneratedKeyContext::isSupportAutoIncrement).map(GeneratedKeyContext::getGeneratedValues).orElseGet(Collections::emptyList);
+ Collection<Comparable<?>> autoIncrementGeneratedValues =
generatedKeyContext.filter(GeneratedKeyContext::isSupportAutoIncrement)
+
.map(GeneratedKeyContext::getGeneratedValues).orElseGet(Collections::emptyList);
UpdateResponseHeader result = new
UpdateResponseHeader(queryContext.getSqlStatementContext().getSqlStatement(),
updateResults, autoIncrementGeneratedValues);
- mergeUpdateCount(queryContext.getSqlStatementContext(), result);
- return result;
- }
-
- private void mergeUpdateCount(final SQLStatementContext
sqlStatementContext, final UpdateResponseHeader response) {
- if (isNeedAccumulate(sqlStatementContext)) {
- response.mergeUpdateCount();
+ if (isNeedAccumulate()) {
+ result.mergeUpdateCount();
}
+ return result;
}
- private boolean isNeedAccumulate(final SQLStatementContext
sqlStatementContext) {
+ private boolean isNeedAccumulate() {
Collection<DataNodeRuleAttribute> ruleAttributes =
queryContext.getUsedDatabase().getRuleMetaData().getAttributes(DataNodeRuleAttribute.class);
- Collection<String> tableNames = sqlStatementContext instanceof
TableAvailable ? ((TableAvailable)
sqlStatementContext).getTablesContext().getTableNames() :
Collections.emptyList();
+ Collection<String> tableNames = queryContext.getSqlStatementContext()
instanceof TableAvailable
+ ? ((TableAvailable)
queryContext.getSqlStatementContext()).getTablesContext().getTableNames()
+ : Collections.emptyList();
return !ruleAttributes.isEmpty() &&
ruleAttributes.iterator().next().isNeedAccumulate(tableNames);
}