You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/10/19 09:37:48 UTC
[shardingsphere] branch master updated: Optimize ShardingSpherePreparedStatement for multi executionContext (#28802)
This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 2d549acce13 Optimize ShardingSpherePreparedStatement for multi executionContext (#28802)
2d549acce13 is described below
commit 2d549acce13d4148d69e3782f61f8a7eb7b4dfb1
Author: Chuxin Chen <ch...@qq.com>
AuthorDate: Thu Oct 19 17:37:42 2023 +0800
Optimize ShardingSpherePreparedStatement for multi executionContext (#28802)
* Optimize ShardingSpherePreparedStatement for multi executionContext
* Refactor ShardingSpherePreparedStatement for support multi executionContext.
---
.../statement/ShardingSpherePreparedStatement.java | 124 +++++++++++++--------
.../core/statement/ShardingSphereStatement.java | 18 ++-
.../proxy/backend/connector/DatabaseConnector.java | 6 +-
3 files changed, 86 insertions(+), 62 deletions(-)
diff --git a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index 228e07a9bce..1fefc7e0380 100644
--- a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++ b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.driver.jdbc.core.statement;
+import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import lombok.AccessLevel;
import lombok.Getter;
@@ -150,7 +151,7 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
@Getter
private final boolean selectContainsEnhancedTable;
- private ExecutionContext executionContext;
+ private Collection<ExecutionContext> executionContexts;
private Map<String, Integer> columnLabelAndIndexMap;
@@ -244,14 +245,8 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
if (useFederation) {
return executeFederationQuery(queryContext);
}
- executionContext = createExecutionContext(queryContext);
- List<QueryResult> queryResults = executeQuery0();
- MergedResult mergedResult = mergeQuery(queryResults);
- List<ResultSet> resultSets = getResultSets();
- if (null == columnLabelAndIndexMap) {
- columnLabelAndIndexMap = ShardingSphereResultSetUtils.createColumnLabelAndIndexMap(sqlStatementContext, selectContainsEnhancedTable, resultSets.get(0).getMetaData());
- }
- result = new ShardingSphereResultSet(resultSets, mergedResult, this, selectContainsEnhancedTable, executionContext, columnLabelAndIndexMap);
+ executionContexts = createExecutionContext(queryContext);
+ result = doExecuteQuery(executionContexts);
// CHECKSTYLE:OFF
} catch (final RuntimeException ex) {
// CHECKSTYLE:ON
@@ -264,6 +259,21 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
return result;
}
+ private ShardingSphereResultSet doExecuteQuery(final Collection<ExecutionContext> executionContexts) throws SQLException {
+ ShardingSphereResultSet result = null;
+ // TODO support multi execution context, currently executionContexts.size() always equals 1
+ for (ExecutionContext each : executionContexts) {
+ List<QueryResult> queryResults = executeQuery0(each);
+ MergedResult mergedResult = mergeQuery(queryResults, each.getSqlStatementContext());
+ List<ResultSet> resultSets = getResultSets();
+ if (null == columnLabelAndIndexMap) {
+ columnLabelAndIndexMap = ShardingSphereResultSetUtils.createColumnLabelAndIndexMap(sqlStatementContext, selectContainsEnhancedTable, resultSets.get(0).getMetaData());
+ }
+ result = new ShardingSphereResultSet(resultSets, mergedResult, this, selectContainsEnhancedTable, each, columnLabelAndIndexMap);
+ }
+ return result;
+ }
+
private boolean decide(final QueryContext queryContext, final ShardingSphereDatabase database, final RuleMetaData globalRuleMetaData) {
return executor.getSqlFederationEngine().decide(queryContext.getSqlStatementContext(), queryContext.getParameters(), database, globalRuleMetaData);
}
@@ -309,12 +319,12 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
replaySetParameter();
}
- private List<QueryResult> executeQuery0() throws SQLException {
+ private List<QueryResult> executeQuery0(final ExecutionContext executionContext) throws SQLException {
if (hasRawExecutionRule()) {
- return executor.getRawExecutor().execute(createRawExecutionGroupContext(),
+ return executor.getRawExecutor().execute(createRawExecutionGroupContext(executionContext),
executionContext.getQueryContext(), new RawSQLExecutorCallback()).stream().map(QueryResult.class::cast).collect(Collectors.toList());
}
- ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = createExecutionGroupContext();
+ ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = createExecutionGroupContext(executionContext);
cacheStatements(executionGroupContext.getInputGroups());
return executor.getRegularExecutor().executeQuery(executionGroupContext, executionContext.getQueryContext(),
new PreparedStatementExecuteQueryCallback(metaDataContexts.getMetaData().getDatabase(databaseName).getProtocolType(),
@@ -351,12 +361,15 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
JDBCExecutionUnit executionUnit = createTrafficExecutionUnit(trafficInstanceId, queryContext);
return executor.getTrafficExecutor().execute(executionUnit, (statement, sql) -> ((PreparedStatement) statement).executeUpdate());
}
- executionContext = createExecutionContext(queryContext);
+ executionContexts = createExecutionContext(queryContext);
if (hasRawExecutionRule()) {
- Collection<ExecuteResult> executeResults = executor.getRawExecutor().execute(createRawExecutionGroupContext(), executionContext.getQueryContext(), new RawSQLExecutorCallback());
- return accumulate(executeResults);
+ Collection<ExecuteResult> results = new LinkedList<>();
+ for (ExecutionContext each : executionContexts) {
+ results.addAll(executor.getRawExecutor().execute(createRawExecutionGroupContext(each), each.getQueryContext(), new RawSQLExecutorCallback()));
+ }
+ return accumulate(results);
}
- return isNeedImplicitCommitTransaction(connection, Collections.singleton(executionContext)) ? executeUpdateWithImplicitCommitTransaction() : useDriverToExecuteUpdate();
+ return isNeedImplicitCommitTransaction(connection, executionContexts) ? executeUpdateWithImplicitCommitTransaction() : useDriverToExecuteUpdate();
// CHECKSTYLE:OFF
} catch (final RuntimeException ex) {
// CHECKSTYLE:ON
@@ -368,10 +381,16 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
}
private int useDriverToExecuteUpdate() throws SQLException {
- ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = createExecutionGroupContext();
- cacheStatements(executionGroupContext.getInputGroups());
- return executor.getRegularExecutor().executeUpdate(executionGroupContext,
- executionContext.getQueryContext(), executionContext.getRouteContext().getRouteUnits(), createExecuteUpdateCallback());
+ Integer result = null;
+ Preconditions.checkArgument(!executionContexts.isEmpty());
+ // TODO support multi execution context, currently executionContexts.size() always equals 1
+ for (ExecutionContext each : executionContexts) {
+ ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = createExecutionGroupContext(each);
+ cacheStatements(executionGroupContext.getInputGroups());
+ result = executor.getRegularExecutor().executeUpdate(executionGroupContext,
+ each.getQueryContext(), each.getRouteContext().getRouteUnits(), createExecuteUpdateCallback());
+ }
+ return result;
}
private int accumulate(final Collection<ExecuteResult> results) {
@@ -420,13 +439,16 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
ResultSet resultSet = executeFederationQuery(queryContext);
return null != resultSet;
}
- executionContext = createExecutionContext(queryContext);
+ executionContexts = createExecutionContext(queryContext);
if (hasRawExecutionRule()) {
- // TODO process getStatement
- Collection<ExecuteResult> executeResults = executor.getRawExecutor().execute(createRawExecutionGroupContext(), executionContext.getQueryContext(), new RawSQLExecutorCallback());
- return executeResults.iterator().next() instanceof QueryResult;
+ Collection<ExecuteResult> results = new LinkedList<>();
+ for (ExecutionContext each : executionContexts) {
+ // TODO process getStatement
+ results.addAll(executor.getRawExecutor().execute(createRawExecutionGroupContext(each), each.getQueryContext(), new RawSQLExecutorCallback()));
+ }
+ return results.iterator().next() instanceof QueryResult;
}
- return isNeedImplicitCommitTransaction(connection, Collections.singleton(executionContext)) ? executeWithImplicitCommitTransaction() : useDriverToExecute();
+ return isNeedImplicitCommitTransaction(connection, executionContexts) ? executeWithImplicitCommitTransaction() : useDriverToExecute();
// CHECKSTYLE:OFF
} catch (final RuntimeException ex) {
// CHECKSTYLE:ON
@@ -446,7 +468,7 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
return false;
}
- private ExecutionGroupContext<RawSQLExecutionUnit> createRawExecutionGroupContext() throws SQLException {
+ private ExecutionGroupContext<RawSQLExecutionUnit> createRawExecutionGroupContext(final ExecutionContext executionContext) throws SQLException {
int maxConnectionsSizePerQuery = metaDataContexts.getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY);
return new RawExecutionPrepareEngine(maxConnectionsSizePerQuery, metaDataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules())
.prepare(executionContext.getRouteContext(), executionContext.getExecutionUnits(), new ExecutionGroupReportContext(databaseName));
@@ -487,10 +509,16 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
}
private boolean useDriverToExecute() throws SQLException {
- ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = createExecutionGroupContext();
- cacheStatements(executionGroupContext.getInputGroups());
- return executor.getRegularExecutor().execute(executionGroupContext,
- executionContext.getQueryContext(), executionContext.getRouteContext().getRouteUnits(), createExecuteCallback());
+ Boolean result = null;
+ Preconditions.checkArgument(!executionContexts.isEmpty());
+ // TODO support multi execution context, currently executionContexts.size() always equals 1
+ for (ExecutionContext each : executionContexts) {
+ ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = createExecutionGroupContext(each);
+ cacheStatements(executionGroupContext.getInputGroups());
+ result = executor.getRegularExecutor().execute(executionGroupContext,
+ each.getQueryContext(), each.getRouteContext().getRouteUnits(), createExecuteCallback());
+ }
+ return result;
}
private JDBCExecutorCallback<Boolean> createExecuteCallback() {
@@ -510,7 +538,7 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
};
}
- private ExecutionGroupContext<JDBCExecutionUnit> createExecutionGroupContext() throws SQLException {
+ private ExecutionGroupContext<JDBCExecutionUnit> createExecutionGroupContext(final ExecutionContext executionContext) throws SQLException {
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine = createDriverExecutionPrepareEngine();
return prepareEngine.prepare(executionContext.getRouteContext(), executionContext.getExecutionUnits(), new ExecutionGroupReportContext(databaseName));
}
@@ -526,16 +554,18 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
if (useFederation) {
return executor.getSqlFederationEngine().getResultSet();
}
- if (executionContext.getSqlStatementContext() instanceof SelectStatementContext || executionContext.getSqlStatementContext().getSqlStatement() instanceof DALStatement) {
+ if (executionContexts.iterator().next().getSqlStatementContext() instanceof SelectStatementContext
+ || executionContexts.iterator().next().getSqlStatementContext().getSqlStatement() instanceof DALStatement) {
List<ResultSet> resultSets = getResultSets();
if (resultSets.isEmpty()) {
return currentResultSet;
}
- MergedResult mergedResult = mergeQuery(getQueryResults(resultSets));
+ SQLStatementContext sqlStatementContext = executionContexts.iterator().next().getSqlStatementContext();
+ MergedResult mergedResult = mergeQuery(getQueryResults(resultSets), sqlStatementContext);
if (null == columnLabelAndIndexMap) {
columnLabelAndIndexMap = ShardingSphereResultSetUtils.createColumnLabelAndIndexMap(sqlStatementContext, selectContainsEnhancedTable, resultSets.get(0).getMetaData());
}
- currentResultSet = new ShardingSphereResultSet(resultSets, mergedResult, this, selectContainsEnhancedTable, executionContext, columnLabelAndIndexMap);
+ currentResultSet = new ShardingSphereResultSet(resultSets, mergedResult, this, selectContainsEnhancedTable, executionContexts.iterator().next(), columnLabelAndIndexMap);
}
return currentResultSet;
}
@@ -560,19 +590,19 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
return result;
}
- private ExecutionContext createExecutionContext(final QueryContext queryContext) {
+ private Collection<ExecutionContext> createExecutionContext(final QueryContext queryContext) {
RuleMetaData globalRuleMetaData = metaDataContexts.getMetaData().getGlobalRuleMetaData();
ShardingSphereDatabase currentDatabase = metaDataContexts.getMetaData().getDatabase(databaseName);
SQLAuditEngine.audit(queryContext.getSqlStatementContext(), queryContext.getParameters(), globalRuleMetaData, currentDatabase, null, queryContext.getHintValueContext());
ExecutionContext result = kernelProcessor.generateExecutionContext(
queryContext, currentDatabase, globalRuleMetaData, metaDataContexts.getMetaData().getProps(), connection.getDatabaseConnectionManager().getConnectionContext());
findGeneratedKey(result).ifPresent(optional -> generatedValues.addAll(optional.getGeneratedValues()));
- return result;
+ return Collections.singleton(result);
}
- private ExecutionContext createExecutionContext(final QueryContext queryContext, final String trafficInstanceId) {
+ private Collection<ExecutionContext> createExecutionContext(final QueryContext queryContext, final String trafficInstanceId) {
ExecutionUnit executionUnit = new ExecutionUnit(trafficInstanceId, new SQLUnit(queryContext.getSql(), queryContext.getParameters()));
- return new ExecutionContext(queryContext, Collections.singletonList(executionUnit), new RouteContext());
+ return Collections.singleton(new ExecutionContext(queryContext, Collections.singletonList(executionUnit), new RouteContext()));
}
private QueryContext createQueryContext() {
@@ -583,10 +613,10 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
return new QueryContext(sqlStatementContext, sql, params, hintValueContext, true);
}
- private MergedResult mergeQuery(final List<QueryResult> queryResults) throws SQLException {
+ private MergedResult mergeQuery(final List<QueryResult> queryResults, final SQLStatementContext sqlStatementContext) throws SQLException {
MergeEngine mergeEngine = new MergeEngine(metaDataContexts.getMetaData().getDatabase(databaseName),
metaDataContexts.getMetaData().getProps(), connection.getDatabaseConnectionManager().getConnectionContext());
- return mergeEngine.merge(queryResults, executionContext.getSqlStatementContext());
+ return mergeEngine.merge(queryResults, sqlStatementContext);
}
private void cacheStatements(final Collection<ExecutionGroup<JDBCExecutionUnit>> executionGroups) throws SQLException {
@@ -629,7 +659,7 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
if (null != currentBatchGeneratedKeysResultSet) {
return currentBatchGeneratedKeysResultSet;
}
- Optional<GeneratedKeyContext> generatedKey = findGeneratedKey(executionContext);
+ Optional<GeneratedKeyContext> generatedKey = findGeneratedKey(executionContexts.iterator().next());
if (generatedKey.isPresent() && statementOption.isReturnGeneratedKeys() && !generatedValues.isEmpty()) {
return new GeneratedKeysResultSet(getGeneratedKeysColumnName(generatedKey.get().getColumnName()), generatedValues.iterator(), this);
}
@@ -652,8 +682,8 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
try {
QueryContext queryContext = createQueryContext();
trafficInstanceId = getInstanceIdAndSet(queryContext).orElse(null);
- executionContext = null == trafficInstanceId ? createExecutionContext(queryContext) : createExecutionContext(queryContext, trafficInstanceId);
- batchPreparedStatementExecutor.addBatchForExecutionUnits(executionContext.getExecutionUnits());
+ executionContexts = null == trafficInstanceId ? createExecutionContext(queryContext) : createExecutionContext(queryContext, trafficInstanceId);
+ batchPreparedStatementExecutor.addBatchForExecutionUnits(executionContexts.iterator().next().getExecutionUnits());
} finally {
currentResultSet = null;
clearParameters();
@@ -662,13 +692,13 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
@Override
public int[] executeBatch() throws SQLException {
- if (null == executionContext) {
+ if (null == executionContexts || executionContexts.isEmpty()) {
return new int[0];
}
try {
// TODO add raw SQL executor
initBatchPreparedStatementExecutor();
- int[] results = batchPreparedStatementExecutor.executeBatch(executionContext.getSqlStatementContext());
+ int[] results = batchPreparedStatementExecutor.executeBatch(executionContexts.iterator().next().getSqlStatementContext());
if (statementOption.isReturnGeneratedKeys() && generatedValues.isEmpty()) {
List<Statement> batchPreparedStatementExecutorStatements = batchPreparedStatementExecutor.getStatements();
for (Statement statement : batchPreparedStatementExecutorStatements) {
@@ -698,7 +728,7 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
ExecutionUnit executionUnit = each.getExecutionUnit();
executionUnits.add(executionUnit);
}
- batchPreparedStatementExecutor.init(prepareEngine.prepare(executionContext.getRouteContext(), executionUnits, new ExecutionGroupReportContext(databaseName)));
+ batchPreparedStatementExecutor.init(prepareEngine.prepare(executionContexts.iterator().next().getRouteContext(), executionUnits, new ExecutionGroupReportContext(databaseName)));
setBatchParametersForStatements();
}
@@ -739,7 +769,7 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
@Override
public boolean isAccumulate() {
return metaDataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
- .anyMatch(each -> each.isNeedAccumulate(executionContext.getSqlStatementContext().getTablesContext().getTableNames()));
+ .anyMatch(each -> each.isNeedAccumulate(executionContexts.iterator().next().getSqlStatementContext().getTablesContext().getTableNames()));
}
@Override
diff --git a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index d787b19f559..d675040734b 100644
--- a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++ b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -191,14 +191,14 @@ public final class ShardingSphereStatement extends AbstractStatementAdapter {
private ShardingSphereResultSet doExecuteQuery(final Collection<ExecutionContext> executionContexts) throws SQLException {
ShardingSphereResultSet result = null;
+ // TODO support multi execution context, currently executionContexts.size() always equals 1
for (ExecutionContext each : executionContexts) {
List<QueryResult> queryResults = executeQuery0(each);
MergedResult mergedResult = mergeQuery(queryResults, each.getSqlStatementContext());
boolean selectContainsEnhancedTable =
each.getSqlStatementContext() instanceof SelectStatementContext && ((SelectStatementContext) each.getSqlStatementContext()).isContainsEnhancedTable();
- if (null == result) {
- result = new ShardingSphereResultSet(getResultSets(), mergedResult, this, selectContainsEnhancedTable, each);
- }
+ result = new ShardingSphereResultSet(getResultSets(), mergedResult, this, selectContainsEnhancedTable, each);
+
}
return result;
}
@@ -363,15 +363,13 @@ public final class ShardingSphereStatement extends AbstractStatementAdapter {
final Collection<ExecutionContext> executionContexts) throws SQLException {
Integer result = null;
Preconditions.checkArgument(!executionContexts.isEmpty());
+ // TODO support multi execution context, currently executionContexts.size() always equals 1
for (ExecutionContext each : executionContexts) {
ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = createExecutionGroupContext(each);
cacheStatements(executionGroupContext.getInputGroups());
JDBCExecutorCallback<Integer> callback = createExecuteUpdateCallback(updateCallback, sqlStatementContext);
- int effectedCount = executor.getRegularExecutor().executeUpdate(executionGroupContext,
+ result = executor.getRegularExecutor().executeUpdate(executionGroupContext,
each.getQueryContext(), each.getRouteContext().getRouteUnits(), callback);
- if (null == result) {
- result = effectedCount;
- }
}
return result;
}
@@ -576,15 +574,13 @@ public final class ShardingSphereStatement extends AbstractStatementAdapter {
private boolean useDriverToExecute(final ExecuteCallback callback, final Collection<ExecutionContext> executionContexts) throws SQLException {
Boolean result = null;
Preconditions.checkArgument(!executionContexts.isEmpty());
+ // TODO support multi execution context, currently executionContexts.size() always equals 1
for (ExecutionContext each : executionContexts) {
ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = createExecutionGroupContext(each);
cacheStatements(executionGroupContext.getInputGroups());
JDBCExecutorCallback<Boolean> jdbcExecutorCallback = createExecuteCallback(callback, each.getSqlStatementContext().getSqlStatement());
- boolean isWrite = executor.getRegularExecutor().execute(executionGroupContext,
+ result = executor.getRegularExecutor().execute(executionGroupContext,
each.getQueryContext(), each.getRouteContext().getRouteUnits(), jdbcExecutorCallback);
- if (null == result) {
- result = isWrite;
- }
}
return result;
}
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 871853cec25..ee51ee8e6dc 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
@@ -222,11 +222,9 @@ public final class DatabaseConnector implements DatabaseBackendHandler {
private ResponseHeader doExecute(final Collection<ExecutionContext> executionContexts) throws SQLException {
ResponseHeader result = null;
+ // TODO support multi execution context, currently executionContexts.size() always equals 1
for (ExecutionContext each : executionContexts) {
- ResponseHeader responseHeader = doExecute(each);
- if (null == result) {
- result = responseHeader;
- }
+ result = doExecute(each);
}
return result;
}