This is an automated email from the ASF dual-hosted git repository.
sunnianjun 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 01305fceedf Refactor ShardingSpherePreparedStatement (#31671)
01305fceedf is described below
commit 01305fceedfeaf264038e104f374796c6d5262a8
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Jun 12 19:03:58 2024 +0800
Refactor ShardingSpherePreparedStatement (#31671)
---
.../executor/engine/DriverExecutorFacade.java | 5 ++-
.../engine/batch/DriverExecuteBatchExecutor.java | 9 ++---
.../statement/ShardingSpherePreparedStatement.java | 43 ++++++++++------------
.../core/statement/ShardingSphereStatement.java | 14 +++----
4 files changed, 32 insertions(+), 39 deletions(-)
diff --git
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecutorFacade.java
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecutorFacade.java
index 48663ead45c..6ed829641c6 100644
---
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecutorFacade.java
+++
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecutorFacade.java
@@ -70,12 +70,13 @@ public final class DriverExecutorFacade implements
AutoCloseable {
private final DriverExecuteExecutor executeExecutor;
- public DriverExecutorFacade(final ShardingSphereConnection connection,
final StatementOption statementOption, final StatementManager statementManager,
- final JDBCExecutor jdbcExecutor, final String
jdbcDriverType, final Grantee grantee) {
+ public DriverExecutorFacade(final ShardingSphereConnection connection,
+ final StatementOption statementOption, final
StatementManager statementManager, final String jdbcDriverType, final Grantee
grantee) {
this.connection = connection;
this.statementOption = statementOption;
this.statementManager = statementManager;
this.jdbcDriverType = jdbcDriverType;
+ JDBCExecutor jdbcExecutor = new
JDBCExecutor(connection.getContextManager().getExecutorEngine(),
connection.getDatabaseConnectionManager().getConnectionContext());
RawExecutor rawExecutor = new
RawExecutor(connection.getContextManager().getExecutorEngine(),
connection.getDatabaseConnectionManager().getConnectionContext());
trafficExecutor = new TrafficExecutor();
ShardingSphereMetaData metaData =
connection.getContextManager().getMetaDataContexts().getMetaData();
diff --git
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/DriverExecuteBatchExecutor.java
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/DriverExecuteBatchExecutor.java
index 8e7f2a7cc0e..121f2237216 100644
---
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/DriverExecuteBatchExecutor.java
+++
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/DriverExecuteBatchExecutor.java
@@ -17,12 +17,11 @@
package org.apache.shardingsphere.driver.executor.engine.batch;
-import lombok.Getter;
-import
org.apache.shardingsphere.driver.executor.engine.batch.statement.BatchExecutionUnit;
-import
org.apache.shardingsphere.driver.executor.engine.batch.statement.BatchPreparedStatementExecutor;
import
org.apache.shardingsphere.driver.executor.callback.add.StatementAddCallback;
import
org.apache.shardingsphere.driver.executor.callback.keygen.GeneratedKeyCallback;
import
org.apache.shardingsphere.driver.executor.callback.replay.PreparedStatementParametersReplayCallback;
+import
org.apache.shardingsphere.driver.executor.engine.batch.statement.BatchExecutionUnit;
+import
org.apache.shardingsphere.driver.executor.engine.batch.statement.BatchPreparedStatementExecutor;
import
org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection;
import org.apache.shardingsphere.driver.jdbc.core.statement.StatementManager;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
@@ -65,7 +64,6 @@ public final class DriverExecuteBatchExecutor {
private final ShardingSphereMetaData metaData;
- @Getter
private final BatchPreparedStatementExecutor
batchPreparedStatementExecutor;
private final DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection>
prepareEngine;
@@ -73,9 +71,10 @@ public final class DriverExecuteBatchExecutor {
private ExecutionContext executionContext;
public DriverExecuteBatchExecutor(final ShardingSphereConnection
connection, final ShardingSphereMetaData metaData, final StatementOption
statementOption, final StatementManager statementManager,
- final ShardingSphereDatabase database,
final JDBCExecutor jdbcExecutor) {
+ final ShardingSphereDatabase database) {
this.connection = connection;
this.metaData = metaData;
+ JDBCExecutor jdbcExecutor = new
JDBCExecutor(connection.getContextManager().getExecutorEngine(),
connection.getDatabaseConnectionManager().getConnectionContext());
batchPreparedStatementExecutor = new
BatchPreparedStatementExecutor(database, jdbcExecutor,
connection.getProcessId());
prepareEngine = createDriverExecutionPrepareEngine(statementOption,
statementManager, database);
}
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 71177e0eb79..d7294fde494 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
@@ -32,7 +32,6 @@ import
org.apache.shardingsphere.infra.binder.context.aware.ParameterAware;
import
org.apache.shardingsphere.infra.binder.context.segment.insert.keygen.GeneratedKeyContext;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext;
-import
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
import
org.apache.shardingsphere.infra.database.core.keygen.GeneratedKeyColumnProvider;
@@ -40,7 +39,6 @@ import
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
import
org.apache.shardingsphere.infra.exception.dialect.SQLExceptionTransformEngine;
import
org.apache.shardingsphere.infra.exception.kernel.syntax.EmptySQLException;
-import
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutor;
import
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.JDBCDriverType;
import
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption;
import org.apache.shardingsphere.infra.hint.HintManager;
@@ -50,7 +48,6 @@ import
org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.apache.shardingsphere.infra.metadata.user.Grantee;
-import org.apache.shardingsphere.infra.parser.SQLParserEngine;
import
org.apache.shardingsphere.infra.rule.attribute.datanode.DataNodeRuleAttribute;
import
org.apache.shardingsphere.infra.rule.attribute.resoure.StorageConnectorReusableRuleAttribute;
import org.apache.shardingsphere.infra.session.query.QueryContext;
@@ -84,9 +81,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
private final String sql;
- private final List<PreparedStatement> statements = new ArrayList<>();
-
- private final List<List<Object>> parameterSets = new ArrayList<>();
+ private final HintValueContext hintValueContext;
private final SQLStatementContext sqlStatementContext;
@@ -94,6 +89,9 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
private final StatementOption statementOption;
+ @Getter(AccessLevel.PROTECTED)
+ private final StatementManager statementManager;
+
@Getter
private final ParameterMetaData parameterMetaData;
@@ -101,22 +99,18 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
private final DriverExecuteBatchExecutor executeBatchExecutor;
- private final Collection<Comparable<?>> generatedValues = new
LinkedList<>();
+ private final List<PreparedStatement> statements = new ArrayList<>();
- private final boolean statementsCacheable;
+ private final List<List<Object>> parameterSets = new ArrayList<>();
- @Getter(AccessLevel.PROTECTED)
- private final StatementManager statementManager;
+ private final Collection<Comparable<?>> generatedValues = new
LinkedList<>();
- @Getter
- private final boolean selectContainsEnhancedTable;
+ private final boolean statementsCacheable;
private Map<String, Integer> columnLabelAndIndexMap;
private ResultSet currentResultSet;
- private final HintValueContext hintValueContext;
-
private ResultSet currentBatchGeneratedKeysResultSet;
public ShardingSpherePreparedStatement(final ShardingSphereConnection
connection, final String sql) throws SQLException {
@@ -145,25 +139,26 @@ public final class ShardingSpherePreparedStatement
extends AbstractPreparedState
ShardingSpherePreconditions.checkNotEmpty(sql, () -> new
EmptySQLException().toSQLException());
this.connection = connection;
metaData =
connection.getContextManager().getMetaDataContexts().getMetaData();
- hintValueContext = SQLHintUtils.extractHint(sql);
this.sql = SQLHintUtils.removeHint(sql);
- SQLParserRule sqlParserRule =
metaData.getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
- SQLParserEngine sqlParserEngine =
sqlParserRule.getSQLParserEngine(metaData.getDatabase(connection.getDatabaseName()).getProtocolType());
- SQLStatement sqlStatement = sqlParserEngine.parse(this.sql, true);
+ hintValueContext = SQLHintUtils.extractHint(sql);
+ SQLStatement sqlStatement = parseSQL(connection);
sqlStatementContext = new SQLBindEngine(metaData,
connection.getDatabaseName(), hintValueContext).bind(sqlStatement,
Collections.emptyList());
databaseName = sqlStatementContext instanceof TableAvailable
? ((TableAvailable)
sqlStatementContext).getTablesContext().getDatabaseName().orElse(connection.getDatabaseName())
: connection.getDatabaseName();
connection.getDatabaseConnectionManager().getConnectionContext().setCurrentDatabase(databaseName);
- parameterMetaData = new ShardingSphereParameterMetaData(sqlStatement);
statementOption = returnGeneratedKeys ? new StatementOption(true,
columns) : new StatementOption(resultSetType, resultSetConcurrency,
resultSetHoldability);
- ShardingSphereDatabase database = metaData.getDatabase(databaseName);
statementManager = new StatementManager();
- JDBCExecutor jdbcExecutor = new
JDBCExecutor(connection.getContextManager().getExecutorEngine(),
connection.getDatabaseConnectionManager().getConnectionContext());
- driverExecutorFacade = new DriverExecutorFacade(connection,
statementOption, statementManager, jdbcExecutor,
JDBCDriverType.PREPARED_STATEMENT, new Grantee("", ""));
- executeBatchExecutor = new DriverExecuteBatchExecutor(connection,
metaData, statementOption, statementManager, database, jdbcExecutor);
+ parameterMetaData = new ShardingSphereParameterMetaData(sqlStatement);
+ ShardingSphereDatabase database = metaData.getDatabase(databaseName);
+ driverExecutorFacade = new DriverExecutorFacade(connection,
statementOption, statementManager, JDBCDriverType.PREPARED_STATEMENT, new
Grantee("", ""));
+ executeBatchExecutor = new DriverExecuteBatchExecutor(connection,
metaData, statementOption, statementManager, database);
statementsCacheable =
isStatementsCacheable(database.getRuleMetaData());
- selectContainsEnhancedTable = sqlStatementContext instanceof
SelectStatementContext && ((SelectStatementContext)
sqlStatementContext).isContainsEnhancedTable();
+ }
+
+ private SQLStatement parseSQL(final ShardingSphereConnection connection) {
+ SQLParserRule sqlParserRule =
metaData.getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
+ return
sqlParserRule.getSQLParserEngine(metaData.getDatabase(connection.getDatabaseName()).getProtocolType()).parse(sql,
true);
}
private boolean isStatementsCacheable(final RuleMetaData
databaseRuleMetaData) {
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 0578a51e0e9..baaf6895344 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
@@ -38,7 +38,6 @@ import
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
import
org.apache.shardingsphere.infra.exception.dialect.SQLExceptionTransformEngine;
import
org.apache.shardingsphere.infra.exception.kernel.syntax.EmptySQLException;
-import
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutor;
import
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.JDBCDriverType;
import
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption;
import org.apache.shardingsphere.infra.hint.HintValueContext;
@@ -72,17 +71,17 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
private final ShardingSphereMetaData metaData;
- private final List<Statement> statements;
-
private final StatementOption statementOption;
- private final DriverExecutorFacade driverExecutorFacade;
-
@Getter(AccessLevel.PROTECTED)
private final StatementManager statementManager;
+ private final DriverExecutorFacade driverExecutorFacade;
+
private final BatchStatementExecutor batchStatementExecutor;
+ private final List<Statement> statements;
+
private String databaseName;
private SQLStatementContext sqlStatementContext;
@@ -102,12 +101,11 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
public ShardingSphereStatement(final ShardingSphereConnection connection,
final int resultSetType, final int resultSetConcurrency, final int
resultSetHoldability) {
this.connection = connection;
metaData =
connection.getContextManager().getMetaDataContexts().getMetaData();
- statements = new LinkedList<>();
statementOption = new StatementOption(resultSetType,
resultSetConcurrency, resultSetHoldability);
statementManager = new StatementManager();
- JDBCExecutor jdbcExecutor = new
JDBCExecutor(connection.getContextManager().getExecutorEngine(),
connection.getDatabaseConnectionManager().getConnectionContext());
- driverExecutorFacade = new DriverExecutorFacade(connection,
statementOption, statementManager, jdbcExecutor, JDBCDriverType.STATEMENT, new
Grantee("", ""));
+ driverExecutorFacade = new DriverExecutorFacade(connection,
statementOption, statementManager, JDBCDriverType.STATEMENT, new Grantee("",
""));
batchStatementExecutor = new BatchStatementExecutor(this);
+ statements = new LinkedList<>();
databaseName = connection.getDatabaseName();
}