This is an automated email from the ASF dual-hosted git repository.
zhaojinchao 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 c60967804c3 Refactor ShardingSpherePreparedStatement (#31672)
c60967804c3 is described below
commit c60967804c3fcac46629f939dcd99111c52a2dcf
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Jun 12 19:12:31 2024 +0800
Refactor ShardingSpherePreparedStatement (#31672)
---
.../statement/ShardingSpherePreparedStatement.java | 31 +++++++++-------------
1 file changed, 13 insertions(+), 18 deletions(-)
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 d7294fde494..e7ce2f8a160 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
@@ -46,7 +46,6 @@ import org.apache.shardingsphere.infra.hint.HintValueContext;
import org.apache.shardingsphere.infra.hint.SQLHintUtils;
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.rule.attribute.datanode.DataNodeRuleAttribute;
import
org.apache.shardingsphere.infra.rule.attribute.resoure.StorageConnectorReusableRuleAttribute;
@@ -85,7 +84,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
private final SQLStatementContext sqlStatementContext;
- private final String databaseName;
+ private final ShardingSphereDatabase database;
private final StatementOption statementOption;
@@ -143,17 +142,17 @@ public final class ShardingSpherePreparedStatement
extends AbstractPreparedState
hintValueContext = SQLHintUtils.extractHint(sql);
SQLStatement sqlStatement = parseSQL(connection);
sqlStatementContext = new SQLBindEngine(metaData,
connection.getDatabaseName(), hintValueContext).bind(sqlStatement,
Collections.emptyList());
- databaseName = sqlStatementContext instanceof TableAvailable
+ String databaseName = sqlStatementContext instanceof TableAvailable
? ((TableAvailable)
sqlStatementContext).getTablesContext().getDatabaseName().orElse(connection.getDatabaseName())
: connection.getDatabaseName();
connection.getDatabaseConnectionManager().getConnectionContext().setCurrentDatabase(databaseName);
+ database = metaData.getDatabase(databaseName);
statementOption = returnGeneratedKeys ? new StatementOption(true,
columns) : new StatementOption(resultSetType, resultSetConcurrency,
resultSetHoldability);
statementManager = new StatementManager();
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());
+ statementsCacheable = isStatementsCacheable();
}
private SQLStatement parseSQL(final ShardingSphereConnection connection) {
@@ -161,8 +160,8 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
return
sqlParserRule.getSQLParserEngine(metaData.getDatabase(connection.getDatabaseName()).getProtocolType()).parse(sql,
true);
}
- private boolean isStatementsCacheable(final RuleMetaData
databaseRuleMetaData) {
- return
databaseRuleMetaData.getAttributes(StorageConnectorReusableRuleAttribute.class).size()
== databaseRuleMetaData.getRules().size() && !HintManager.isInstantiated();
+ private boolean isStatementsCacheable() {
+ return
database.getRuleMetaData().getAttributes(StorageConnectorReusableRuleAttribute.class).size()
== database.getRuleMetaData().getRules().size() &&
!HintManager.isInstantiated();
}
@Override
@@ -175,7 +174,6 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
clearPrevious();
QueryContext queryContext = createQueryContext();
handleAutoCommit(queryContext.getSqlStatementContext().getSqlStatement());
- ShardingSphereDatabase database =
metaData.getDatabase(databaseName);
findGeneratedKey().ifPresent(optional ->
generatedValues.addAll(optional.getGeneratedValues()));
currentResultSet = driverExecutorFacade.executeQuery(database,
queryContext, this, columnLabelAndIndexMap,
(StatementAddCallback<PreparedStatement>) this::addStatements, this::replay);
if (currentResultSet instanceof ShardingSphereResultSet) {
@@ -186,7 +184,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
} catch (final RuntimeException ex) {
// CHECKSTYLE:ON
handleExceptionInTransaction(connection, metaData);
- throw SQLExceptionTransformEngine.toSQLException(ex,
metaData.getDatabase(databaseName).getProtocolType());
+ throw SQLExceptionTransformEngine.toSQLException(ex,
database.getProtocolType());
} finally {
executeBatchExecutor.clear();
clearParameters();
@@ -218,7 +216,6 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
clearPrevious();
QueryContext queryContext = createQueryContext();
handleAutoCommit(queryContext.getSqlStatementContext().getSqlStatement());
- ShardingSphereDatabase database =
metaData.getDatabase(databaseName);
int result = driverExecutorFacade.executeUpdate(database,
queryContext,
(sql, statement) -> ((PreparedStatement)
statement).executeUpdate(), (StatementAddCallback<PreparedStatement>)
this::addStatements, this::replay);
findGeneratedKey().ifPresent(optional ->
generatedValues.addAll(optional.getGeneratedValues()));
@@ -227,7 +224,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
} catch (final RuntimeException ex) {
// CHECKSTYLE:ON
handleExceptionInTransaction(connection, metaData);
- throw SQLExceptionTransformEngine.toSQLException(ex,
metaData.getDatabase(databaseName).getProtocolType());
+ throw SQLExceptionTransformEngine.toSQLException(ex,
database.getProtocolType());
} finally {
clearBatch();
}
@@ -243,7 +240,6 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
clearPrevious();
QueryContext queryContext = createQueryContext();
handleAutoCommit(queryContext.getSqlStatementContext().getSqlStatement());
- ShardingSphereDatabase database =
metaData.getDatabase(databaseName);
boolean result = driverExecutorFacade.execute(database,
queryContext, (sql, statement) -> ((PreparedStatement) statement).execute(),
(StatementAddCallback<PreparedStatement>)
this::addStatements, this::replay);
findGeneratedKey().ifPresent(optional ->
generatedValues.addAll(optional.getGeneratedValues()));
@@ -252,7 +248,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
} catch (final RuntimeException ex) {
// CHECKSTYLE:ON
handleExceptionInTransaction(connection, metaData);
- throw SQLExceptionTransformEngine.toSQLException(ex,
metaData.getDatabase(databaseName).getProtocolType());
+ throw SQLExceptionTransformEngine.toSQLException(ex,
database.getProtocolType());
} finally {
clearBatch();
}
@@ -263,7 +259,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
if (null != currentResultSet) {
return currentResultSet;
}
- driverExecutorFacade.getResultSet(metaData.getDatabase(databaseName),
sqlStatementContext, this, statements).ifPresent(optional -> currentResultSet =
optional);
+ driverExecutorFacade.getResultSet(database, sqlStatementContext, this,
statements).ifPresent(optional -> currentResultSet = optional);
if (null == columnLabelAndIndexMap && currentResultSet instanceof
ShardingSphereResultSet) {
columnLabelAndIndexMap = ((ShardingSphereResultSet)
currentResultSet).getColumnLabelAndIndexMap();
}
@@ -322,7 +318,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
}
private String getGeneratedKeysColumnName(final String columnName) {
- return
DatabaseTypedSPILoader.findService(GeneratedKeyColumnProvider.class,
metaData.getDatabase(databaseName).getProtocolType())
+ return
DatabaseTypedSPILoader.findService(GeneratedKeyColumnProvider.class,
database.getProtocolType())
.map(GeneratedKeyColumnProvider::getColumnName).orElse(columnName);
}
@@ -330,14 +326,13 @@ public final class ShardingSpherePreparedStatement
extends AbstractPreparedState
public void addBatch() {
currentResultSet = null;
QueryContext queryContext = createQueryContext();
- executeBatchExecutor.addBatch(queryContext,
metaData.getDatabase(databaseName));
+ executeBatchExecutor.addBatch(queryContext, database);
findGeneratedKey().ifPresent(optional ->
generatedValues.addAll(optional.getGeneratedValues()));
clearParameters();
}
@Override
public int[] executeBatch() throws SQLException {
- ShardingSphereDatabase database = metaData.getDatabase(databaseName);
try {
return executeBatchExecutor.executeBatch(database,
sqlStatementContext, generatedValues, statementOption,
(StatementAddCallback<PreparedStatement>) (statements,
parameterSets) -> this.statements.addAll(statements),
@@ -385,7 +380,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
if (!(sqlStatementContext instanceof TableAvailable)) {
return false;
}
- for (DataNodeRuleAttribute each :
metaData.getDatabase(databaseName).getRuleMetaData().getAttributes(DataNodeRuleAttribute.class))
{
+ for (DataNodeRuleAttribute each :
database.getRuleMetaData().getAttributes(DataNodeRuleAttribute.class)) {
if (each.isNeedAccumulate(((TableAvailable)
sqlStatementContext).getTablesContext().getTableNames())) {
return true;
}