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;
+        }
+    }
 }