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 5c394e431be Refactor DriverExecutor (#31422)
5c394e431be is described below
commit 5c394e431be890ea478dc07a85034a27cb6dc545
Author: Liang Zhang <[email protected]>
AuthorDate: Tue May 28 12:21:32 2024 +0800
Refactor DriverExecutor (#31422)
---
.../driver/executor/DriverExecutor.java | 51 ++++++++--------------
.../statement/ShardingSpherePreparedStatement.java | 3 +-
2 files changed, 19 insertions(+), 35 deletions(-)
diff --git
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
index ad349f07178..5c6136bf646 100644
---
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
+++
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
@@ -93,40 +93,27 @@ public final class DriverExecutor implements AutoCloseable {
final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine)
throws SQLException {
Optional<String> trafficInstanceId =
connection.getTrafficInstanceId(metaData.getGlobalRuleMetaData().getSingleRule(TrafficRule.class),
queryContext);
if (trafficInstanceId.isPresent()) {
- TrafficExecutorCallback<ResultSet> trafficCallback =
JDBCDriverType.STATEMENT.equals(prepareEngine.getType())
- ? Statement::executeQuery
- : ((statement, sql) -> ((PreparedStatement)
statement).executeQuery());
- return
Optional.of(trafficExecutor.execute(connection.getProcessId(),
database.getName(), trafficInstanceId.get(), queryContext, prepareEngine,
trafficCallback));
+ return Optional.of(trafficExecutor.execute(
+ connection.getProcessId(), database.getName(),
trafficInstanceId.get(), queryContext, prepareEngine,
getTrafficExecutorCallback(prepareEngine)));
}
if (sqlFederationEngine.decide(queryContext.getSqlStatementContext(),
queryContext.getParameters(), database, metaData.getGlobalRuleMetaData())) {
- ExecuteQueryCallback sqlFederationCallback =
JDBCDriverType.STATEMENT.equals(prepareEngine.getType())
- ? new
StatementExecuteQueryCallback(database.getProtocolType(),
database.getResourceMetaData(),
-
queryContext.getSqlStatementContext().getSqlStatement(),
SQLExecutorExceptionHandler.isExceptionThrown())
- : new
PreparedStatementExecuteQueryCallback(database.getProtocolType(),
- database.getResourceMetaData(),
queryContext.getSqlStatementContext().getSqlStatement(),
SQLExecutorExceptionHandler.isExceptionThrown());
- return Optional.of(sqlFederationEngine.executeQuery(prepareEngine,
sqlFederationCallback, new SQLFederationContext(false, queryContext, metaData,
connection.getProcessId())));
+ return Optional.of(sqlFederationEngine.executeQuery(
+ prepareEngine, getSQLFederationCallback(database,
queryContext, prepareEngine), new SQLFederationContext(false, queryContext,
metaData, connection.getProcessId())));
}
return Optional.empty();
}
- /**
- * Execute advance update.
- *
- * @param metaData meta data
- * @param database database
- * @param queryContext query context
- * @param prepareEngine prepare engine
- * @return updated row count
- * @throws SQLException SQL exception
- */
- public Optional<Integer> executeAdvanceUpdate(final ShardingSphereMetaData
metaData, final ShardingSphereDatabase database, final QueryContext
queryContext,
- final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine)
throws SQLException {
- Optional<String> trafficInstanceId =
connection.getTrafficInstanceId(metaData.getGlobalRuleMetaData().getSingleRule(TrafficRule.class),
queryContext);
- if (trafficInstanceId.isPresent()) {
- return
Optional.of(trafficExecutor.execute(connection.getProcessId(),
database.getName(),
- trafficInstanceId.get(), queryContext, prepareEngine,
(statement, sql) -> ((PreparedStatement) statement).executeUpdate()));
- }
- return Optional.empty();
+ private TrafficExecutorCallback<ResultSet>
getTrafficExecutorCallback(final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine) {
+ return JDBCDriverType.STATEMENT.equals(prepareEngine.getType()) ?
Statement::executeQuery : ((statement, sql) -> ((PreparedStatement)
statement).executeQuery());
+ }
+
+ private ExecuteQueryCallback getSQLFederationCallback(final
ShardingSphereDatabase database, final QueryContext queryContext,
+ final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine) {
+ return JDBCDriverType.STATEMENT.equals(prepareEngine.getType())
+ ? new
StatementExecuteQueryCallback(database.getProtocolType(),
database.getResourceMetaData(),
+
queryContext.getSqlStatementContext().getSqlStatement(),
SQLExecutorExceptionHandler.isExceptionThrown())
+ : new
PreparedStatementExecuteQueryCallback(database.getProtocolType(),
database.getResourceMetaData(),
+
queryContext.getSqlStatementContext().getSqlStatement(),
SQLExecutorExceptionHandler.isExceptionThrown());
}
/**
@@ -171,12 +158,8 @@ public final class DriverExecutor implements AutoCloseable
{
}
if (sqlFederationEngine.decide(queryContext.getSqlStatementContext(),
queryContext.getParameters(), database, metaData.getGlobalRuleMetaData())) {
executeType = ExecuteType.FEDERATION;
- ExecuteQueryCallback sqlFederationCallback =
JDBCDriverType.STATEMENT.equals(prepareEngine.getType())
- ? new
StatementExecuteQueryCallback(database.getProtocolType(),
database.getResourceMetaData(),
-
queryContext.getSqlStatementContext().getSqlStatement(),
SQLExecutorExceptionHandler.isExceptionThrown())
- : new
PreparedStatementExecuteQueryCallback(database.getProtocolType(),
database.getResourceMetaData(),
-
queryContext.getSqlStatementContext().getSqlStatement(),
SQLExecutorExceptionHandler.isExceptionThrown());
- ResultSet resultSet =
sqlFederationEngine.executeQuery(prepareEngine, sqlFederationCallback, new
SQLFederationContext(false, queryContext, metaData, connection.getProcessId()));
+ ResultSet resultSet = sqlFederationEngine.executeQuery(
+ prepareEngine, getSQLFederationCallback(database,
queryContext, prepareEngine), new SQLFederationContext(false, queryContext,
metaData, connection.getProcessId()));
return Optional.of(null != resultSet);
}
return Optional.empty();
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 35bf260aeda..9bb56e20c94 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
@@ -295,7 +295,8 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
QueryContext queryContext = createQueryContext();
handleAutoCommit(queryContext.getSqlStatementContext().getSqlStatement());
ShardingSphereDatabase database =
metaDataContexts.getMetaData().getDatabase(databaseName);
- Optional<Integer> updatedCount =
executor.executeAdvanceUpdate(metaDataContexts.getMetaData(), database,
queryContext, createDriverExecutionPrepareEngine(database));
+ Optional<Integer> updatedCount =
executor.executeAdvanceUpdate(metaDataContexts.getMetaData(), database,
queryContext, createDriverExecutionPrepareEngine(database),
+ (statement, sql) -> ((PreparedStatement)
statement).executeUpdate());
if (updatedCount.isPresent()) {
return updatedCount.get();
}