You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2020/09/07 15:20:27 UTC
[shardingsphere] branch master updated: #6872,
concurrent truncate (#7300)
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 d2bb5e6 #6872, concurrent truncate (#7300)
d2bb5e6 is described below
commit d2bb5e68f60398bea34cb0b3529fd5369300345d
Author: Zhang Yonglun <zh...@apache.org>
AuthorDate: Mon Sep 7 23:20:13 2020 +0800
#6872, concurrent truncate (#7300)
* #6872, concurrent truncate
* #6872, refine
* #6872, for comments
---
.../shardingsphere/dbtest/engine/BatchIT.java | 2 +-
.../dbtest/engine/dml/BaseDMLIT.java | 2 +-
.../dbtest/engine/dql/BaseDQLIT.java | 2 +-
.../env/dataset/DataSetEnvironmentManager.java | 54 ++++++++++++++--------
4 files changed, 39 insertions(+), 21 deletions(-)
diff --git a/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/engine/BatchIT.java b/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/engine/BatchIT.java
index f0a644a..35b424c 100644
--- a/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/engine/BatchIT.java
+++ b/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/engine/BatchIT.java
@@ -96,7 +96,7 @@ public abstract class BatchIT extends BaseIT {
}
@After
- public void clearData() throws SQLException {
+ public void clearData() {
dataSetEnvironmentManager.clear();
}
diff --git a/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/engine/dml/BaseDMLIT.java b/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/engine/dml/BaseDMLIT.java
index 7e576c5..8a03d49 100644
--- a/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/engine/dml/BaseDMLIT.java
+++ b/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/engine/dml/BaseDMLIT.java
@@ -81,7 +81,7 @@ public abstract class BaseDMLIT extends SingleIT {
}
@After
- public void clearData() throws SQLException {
+ public void clearData() {
dataSetEnvironmentManager.clear();
}
diff --git a/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/engine/dql/BaseDQLIT.java b/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/engine/dql/BaseDQLIT.java
index 24e954e..2ca9545 100644
--- a/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/engine/dql/BaseDQLIT.java
+++ b/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/engine/dql/BaseDQLIT.java
@@ -85,7 +85,7 @@ public abstract class BaseDQLIT extends SingleIT {
dropDatabases();
}
- private static void clearData(final DatabaseType databaseType) throws SQLException, IOException, JAXBException {
+ private static void clearData(final DatabaseType databaseType) throws IOException, JAXBException {
for (String each : IntegrateTestEnvironment.getInstance().getRuleTypes()) {
new DataSetEnvironmentManager(EnvironmentPath.getDataInitializeResourceFile(each), createDataSourceMap(databaseType, each)).clear();
}
diff --git a/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/env/dataset/DataSetEnvironmentManager.java b/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/env/dataset/DataSetEnvironmentManager.java
index cac3d59..d4e8438 100644
--- a/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/env/dataset/DataSetEnvironmentManager.java
+++ b/shardingsphere-integration-test/shardingsphere-test-suite/src/test/java/org/apache/shardingsphere/dbtest/env/dataset/DataSetEnvironmentManager.java
@@ -18,16 +18,18 @@
package org.apache.shardingsphere.dbtest.env.dataset;
import com.google.common.base.Joiner;
+import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.dbtest.cases.assertion.root.SQLValue;
import org.apache.shardingsphere.dbtest.cases.assertion.root.SQLValueGroup;
import org.apache.shardingsphere.dbtest.cases.dataset.DataSet;
import org.apache.shardingsphere.dbtest.cases.dataset.metadata.DataSetColumn;
import org.apache.shardingsphere.dbtest.cases.dataset.metadata.DataSetMetadata;
import org.apache.shardingsphere.dbtest.cases.dataset.row.DataSetRow;
-import org.apache.shardingsphere.sharding.algorithm.sharding.inline.InlineExpressionParser;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.database.type.DatabaseTypes;
import org.apache.shardingsphere.infra.datanode.DataNode;
+import org.apache.shardingsphere.infra.executor.kernel.impl.ShardingSphereExecutorService;
+import org.apache.shardingsphere.sharding.algorithm.sharding.inline.InlineExpressionParser;
import javax.sql.DataSource;
import javax.xml.bind.JAXBContext;
@@ -44,6 +46,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.concurrent.Callable;
/**
* Data set environment manager.
@@ -54,6 +57,8 @@ public final class DataSetEnvironmentManager {
private final Map<String, DataSource> dataSourceMap;
+ private final ShardingSphereExecutorService shardingSphereExecutorService = new ShardingSphereExecutorService(20);
+
public DataSetEnvironmentManager(final String path, final Map<String, DataSource> dataSourceMap) throws IOException, JAXBException {
try (FileReader reader = new FileReader(path)) {
dataSet = (DataSet) JAXBContext.newInstance(DataSet.class).createUnmarshaller().unmarshal(reader);
@@ -126,25 +131,17 @@ public final class DataSetEnvironmentManager {
/**
* Clear data.
*
- * @throws SQLException SQL exception
*/
- public void clear() throws SQLException {
+ public void clear() {
+ List<Callable<Void>> clearTasks = new LinkedList<>();
for (Entry<String, Collection<String>> entry : getDataNodeMap().entrySet()) {
- clear(entry.getKey(), entry.getValue());
+ clearTasks.add(new ClearTask(dataSourceMap.get(entry.getKey()), entry.getValue()));
}
- }
-
- private void clear(final String dataSourceName, final Collection<String> tableNames) throws SQLException {
- try (Connection connection = dataSourceMap.get(dataSourceName).getConnection()) {
- for (String each : tableNames) {
- String tableName = generateTableName(each, DatabaseTypes.getDatabaseTypeByURL(connection.getMetaData().getURL()));
- try (PreparedStatement preparedStatement = connection.prepareStatement(String.format("TRUNCATE TABLE %s", tableName))) {
- preparedStatement.executeUpdate();
- // CHECKSTYLE:OFF
- } catch (final SQLException ex) {
- // CHECKSTYLE:ON
- }
- }
+ try {
+ shardingSphereExecutorService.getExecutorService().invokeAll(clearTasks);
+ // CHECKSTYLE:OFF
+ } catch (final Exception ex) {
+ // CHECKSTYLE:ON
}
}
@@ -173,7 +170,7 @@ public final class DataSetEnvironmentManager {
return result;
}
- private String generateTableName(final String tableName, final DatabaseType databaseType) {
+ private static String generateTableName(final String tableName, final DatabaseType databaseType) {
switch (databaseType.getName()) {
case "H2":
case "PostgreSQL":
@@ -187,4 +184,25 @@ public final class DataSetEnvironmentManager {
throw new UnsupportedOperationException(String.format("Cannot support database [%s].", databaseType));
}
}
+
+ @RequiredArgsConstructor
+ private static class ClearTask implements Callable<Void> {
+
+ private final DataSource dataSource;
+
+ private final Collection<String> tableNames;
+
+ @Override
+ public Void call() throws SQLException {
+ try (Connection connection = dataSource.getConnection()) {
+ for (String each : tableNames) {
+ String tableName = generateTableName(each, DatabaseTypes.getDatabaseTypeByURL(connection.getMetaData().getURL()));
+ try (PreparedStatement preparedStatement = connection.prepareStatement(String.format("TRUNCATE TABLE %s", tableName))) {
+ preparedStatement.execute();
+ }
+ }
+ }
+ return null;
+ }
+ }
}