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 812c0d5  Refactor parallel runner executor (#9469)
812c0d5 is described below

commit 812c0d51046028b6a1f01e3bb246c6d1aa9d0d8e
Author: AlphaPo <[email protected]>
AuthorDate: Tue Feb 23 17:50:33 2021 +0800

    Refactor parallel runner executor (#9469)
    
    * merge untracked file
    
    * Simplify test class constructors
    Tuning an embedded database singleton instance
    Add case run time policy
    Lazy load case executors
    
    * add license
    
    * Refactor runtime strategy
    remove disruptor
---
 pom.xml                                            |   7 -
 .../shardingsphere-integration-test-suite/pom.xml  |   4 -
 .../test/integration/engine/it/BaseIT.java         |   4 +-
 .../test/integration/engine/it/BatchIT.java        |  15 +-
 .../ParallelLevel.java}                            |  15 +-
 .../RuntimeStrategy.java}                          |  28 ++-
 .../test/integration/engine/it/SingleIT.java       |  15 +-
 .../test/integration/engine/it/dal/BaseDALIT.java  |   9 +-
 .../integration/engine/it/dal/GeneralDALIT.java    |  11 +-
 .../test/integration/engine/it/dcl/BaseDCLIT.java  |  11 +-
 .../integration/engine/it/dcl/GeneralDCLIT.java    |  11 +-
 .../test/integration/engine/it/ddl/BaseDDLIT.java  |  11 +-
 .../integration/engine/it/ddl/GeneralDDLIT.java    |  11 +-
 .../integration/engine/it/dml/AdditionalDMLIT.java |  11 +-
 .../test/integration/engine/it/dml/BaseDMLIT.java  |  11 +-
 .../test/integration/engine/it/dml/BatchDMLIT.java |   9 +-
 .../integration/engine/it/dml/GeneralDMLIT.java    |  11 +-
 .../integration/engine/it/dql/AdditionalDQLIT.java |  16 +-
 .../test/integration/engine/it/dql/BaseDQLIT.java  |   8 +-
 .../integration/engine/it/dql/GeneralDQLIT.java    |  11 +-
 ...llelParameterized.java => ITParameterized.java} |  15 +-
 .../junit/parallel/ParallelRunnerScheduler.java    |  93 +++++++---
 .../parallel/impl/CaseParallelRunnerExecutor.java  |  25 ++-
 .../impl/ScenarioParallelRunnerExecutor.java       | 202 ++++++++++-----------
 .../env/IntegrationTestEnvironment.java            |  29 ++-
 .../EmbeddedDatabaseDistributionProperties.java    |  10 +
 .../database/embedded/EmbeddedDatabaseManager.java |   9 +-
 .../resources/env/embedded-databases.properties    |   2 +
 28 files changed, 323 insertions(+), 291 deletions(-)

diff --git a/pom.xml b/pom.xml
index 5f325e4..b289ec9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -107,7 +107,6 @@
         <calcite.version>1.26.0</calcite.version>
         <embedded-mysql.version>4.6.1</embedded-mysql.version>
         <embedded-postgresql.version>2.10</embedded-postgresql.version>
-        <disruptor.version>3.4.2</disruptor.version>
         
         <!-- Plugin versions -->
         <apache-rat-plugin.version>0.12</apache-rat-plugin.version>
@@ -470,12 +469,6 @@
                 <version>${embedded-postgresql.version}</version>
                 <scope>test</scope>
             </dependency>
-            <dependency>
-                <groupId>com.lmax</groupId>
-                <artifactId>disruptor</artifactId>
-                <version>${disruptor.version}</version>
-                <scope>test</scope>
-            </dependency>
         </dependencies>
     </dependencyManagement>
     
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/pom.xml
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/pom.xml
index f1d9c0f..9fe5c7f 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/pom.xml
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/pom.xml
@@ -79,10 +79,6 @@
             <artifactId>postgresql-embedded</artifactId>
         </dependency>
         <dependency>
-            <groupId>com.lmax</groupId>
-            <artifactId>disruptor</artifactId>
-        </dependency>
-        <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-dbcp2</artifactId>
             <scope>test</scope>
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BaseIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BaseIT.java
index a202296..6e07d6c 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BaseIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BaseIT.java
@@ -22,7 +22,7 @@ import lombok.Getter;
 import 
org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;
 import 
org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import 
org.apache.shardingsphere.test.integration.engine.junit.parallel.ParallelParameterized;
+import org.apache.shardingsphere.test.integration.engine.junit.ITParameterized;
 import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
 import org.apache.shardingsphere.test.integration.env.EnvironmentType;
 import 
org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
@@ -41,7 +41,7 @@ import java.sql.SQLException;
 import java.util.Map;
 import java.util.TimeZone;
 
-@RunWith(ParallelParameterized.class)
+@RunWith(ITParameterized.class)
 @Getter(AccessLevel.PROTECTED)
 public abstract class BaseIT {
     
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BatchIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BatchIT.java
index 4853655..c118d54 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BatchIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BatchIT.java
@@ -19,7 +19,6 @@ package org.apache.shardingsphere.test.integration.engine.it;
 
 import lombok.AccessLevel;
 import lombok.Getter;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.sharding.algorithm.sharding.inline.InlineExpressionParser;
 import 
org.apache.shardingsphere.test.integration.cases.IntegrationTestCaseContext;
@@ -29,6 +28,7 @@ import 
org.apache.shardingsphere.test.integration.cases.dataset.DataSetLoader;
 import 
org.apache.shardingsphere.test.integration.cases.dataset.metadata.DataSetColumn;
 import 
org.apache.shardingsphere.test.integration.cases.dataset.metadata.DataSetMetadata;
 import org.apache.shardingsphere.test.integration.cases.dataset.row.DataSetRow;
+import 
org.apache.shardingsphere.test.integration.engine.param.model.CaseParameterizedArray;
 import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
 import 
org.apache.shardingsphere.test.integration.env.dataset.DataSetEnvironmentManager;
 import org.junit.After;
@@ -66,16 +66,15 @@ public abstract class BatchIT extends BaseIT {
     @Getter(AccessLevel.NONE)
     private final DataSetEnvironmentManager dataSetEnvironmentManager;
     
-    protected BatchIT(final IntegrationTestCaseContext testCaseContext,
-                      final String adapter, final String scenario, final 
DatabaseType databaseType, final String sql) throws IOException, JAXBException, 
SQLException {
-        super(adapter, scenario, databaseType);
-        this.testCaseContext = testCaseContext;
-        this.sql = sql;
+    protected BatchIT(final CaseParameterizedArray parameterizedArray) throws 
IOException, JAXBException, SQLException {
+        super(parameterizedArray.getAdapter(), 
parameterizedArray.getScenario(), parameterizedArray.getDatabaseType());
+        this.testCaseContext = parameterizedArray.getTestCaseContext();
+        this.sql = 
parameterizedArray.getTestCaseContext().getTestCase().getSql();
         dataSets = new LinkedList<>();
         for (IntegrationTestCaseAssertion each : 
testCaseContext.getTestCase().getAssertions()) {
-            dataSets.add(DataSetLoader.load(testCaseContext.getParentPath(), 
scenario, databaseType, each.getExpectedDataFile()));
+            dataSets.add(DataSetLoader.load(testCaseContext.getParentPath(), 
parameterizedArray.getScenario(), parameterizedArray.getDatabaseType(), 
each.getExpectedDataFile()));
         }
-        dataSetEnvironmentManager = new 
DataSetEnvironmentManager(EnvironmentPath.getDataSetFile(scenario), 
getActualDataSources());
+        dataSetEnvironmentManager = new 
DataSetEnvironmentManager(EnvironmentPath.getDataSetFile(parameterizedArray.getScenario()),
 getActualDataSources());
     }
     
     @Before
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/ParallelParameterized.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/ParallelLevel.java
similarity index 66%
copy from 
shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/ParallelParameterized.java
copy to 
shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/ParallelLevel.java
index acd5729..5376e4e 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/ParallelParameterized.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/ParallelLevel.java
@@ -15,19 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.test.integration.engine.junit.parallel;
-
-import org.junit.runners.Parameterized;
+package org.apache.shardingsphere.test.integration.engine.it;
 
 /**
- * Parallel parameterized.
+ * Case runtime parallel level.
  */
-public final class ParallelParameterized extends Parameterized {
+public enum ParallelLevel {
     
-    //CHECKSTYLE:OFF
-    public ParallelParameterized(final Class<?> klass) throws Throwable {
-        //CHECKSTYLE:ON
-        super(klass);
-        setScheduler(new ParallelRunnerScheduler());
-    }
+    CASE, SCENARIO
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/ParallelParameterized.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/RuntimeStrategy.java
similarity index 58%
copy from 
shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/ParallelParameterized.java
copy to 
shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/RuntimeStrategy.java
index acd5729..2753f8c 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/ParallelParameterized.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/RuntimeStrategy.java
@@ -15,19 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.test.integration.engine.junit.parallel;
+package org.apache.shardingsphere.test.integration.engine.it;
 
-import org.junit.runners.Parameterized;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
 /**
- * Parallel parameterized.
+ * Case runtime strategy.
  */
-public final class ParallelParameterized extends Parameterized {
+@Documented
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+public @interface RuntimeStrategy {
     
-    //CHECKSTYLE:OFF
-    public ParallelParameterized(final Class<?> klass) throws Throwable {
-        //CHECKSTYLE:ON
-        super(klass);
-        setScheduler(new ParallelRunnerScheduler());
-    }
+    /**
+     * Set/Get parallel level.
+     * @return ParallelLevel parallel level
+     */
+    ParallelLevel parallelLevel();
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/SingleIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/SingleIT.java
index 19ae29d..62f4b44 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/SingleIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/SingleIT.java
@@ -19,13 +19,13 @@ package 
org.apache.shardingsphere.test.integration.engine.it;
 
 import lombok.AccessLevel;
 import lombok.Getter;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import 
org.apache.shardingsphere.test.integration.cases.assertion.IntegrationTestCaseAssertion;
 import org.apache.shardingsphere.test.integration.engine.param.SQLExecuteType;
 import org.apache.shardingsphere.test.integration.cases.value.SQLValue;
 import org.apache.shardingsphere.test.integration.cases.dataset.DataSet;
 import org.apache.shardingsphere.test.integration.cases.dataset.DataSetLoader;
 import org.apache.shardingsphere.test.integration.engine.junit.ITWatcher;
+import 
org.apache.shardingsphere.test.integration.engine.param.model.AssertionParameterizedArray;
 import org.junit.Rule;
 
 import javax.xml.bind.JAXBException;
@@ -52,14 +52,15 @@ public abstract class SingleIT extends BaseIT {
     
     private final String sql;
     
-    protected SingleIT(final String parentPath, final 
IntegrationTestCaseAssertion assertion, final String adapter, final String 
scenario,
-                       final DatabaseType databaseType, final SQLExecuteType 
sqlExecuteType, final String sql) throws IOException, JAXBException, 
SQLException, ParseException {
-        super(adapter, scenario, databaseType);
+    protected SingleIT(final AssertionParameterizedArray parameterizedArray) 
throws IOException, JAXBException, SQLException, ParseException {
+        super(parameterizedArray.getAdapter(), 
parameterizedArray.getScenario(), parameterizedArray.getDatabaseType());
+        String sql = 
parameterizedArray.getTestCaseContext().getTestCase().getSql();
         caseIdentifier = sql;
-        this.assertion = assertion;
-        this.sqlExecuteType = sqlExecuteType;
+        this.assertion = parameterizedArray.getAssertion();
+        this.sqlExecuteType = parameterizedArray.getSqlExecuteType();
         this.sql = sqlExecuteType == SQLExecuteType.Literal ? 
getLiteralSQL(sql) : sql;
-        dataSet = null == assertion ? null : DataSetLoader.load(parentPath, 
scenario, databaseType, assertion.getExpectedDataFile());
+        dataSet = null == assertion ? null : 
DataSetLoader.load(parameterizedArray.getTestCaseContext().getParentPath(), 
parameterizedArray.getScenario(),
+                parameterizedArray.getDatabaseType(), 
assertion.getExpectedDataFile());
     }
     
     private String getLiteralSQL(final String sql) throws ParseException {
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dal/BaseDALIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dal/BaseDALIT.java
index 29116b4..4499396 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dal/BaseDALIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dal/BaseDALIT.java
@@ -17,13 +17,11 @@
 
 package org.apache.shardingsphere.test.integration.engine.it.dal;
 
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import 
org.apache.shardingsphere.test.integration.cases.assertion.IntegrationTestCaseAssertion;
 import 
org.apache.shardingsphere.test.integration.cases.dataset.metadata.DataSetColumn;
 import 
org.apache.shardingsphere.test.integration.cases.dataset.metadata.DataSetMetadata;
 import org.apache.shardingsphere.test.integration.cases.dataset.row.DataSetRow;
 import org.apache.shardingsphere.test.integration.engine.it.SingleIT;
-import org.apache.shardingsphere.test.integration.engine.param.SQLExecuteType;
+import 
org.apache.shardingsphere.test.integration.engine.param.model.AssertionParameterizedArray;
 
 import javax.xml.bind.JAXBException;
 import java.io.IOException;
@@ -43,9 +41,8 @@ import static org.junit.Assert.assertTrue;
 
 public abstract class BaseDALIT extends SingleIT {
     
-    protected BaseDALIT(final String parentPath, final 
IntegrationTestCaseAssertion assertion, final String adapter, final String 
scenario,
-                        final DatabaseType databaseType, final SQLExecuteType 
sqlExecuteType, final String sql) throws IOException, JAXBException, 
SQLException, ParseException {
-        super(parentPath, assertion, adapter, scenario, databaseType, 
sqlExecuteType, sql);
+    protected BaseDALIT(final AssertionParameterizedArray parameterizedArray) 
throws IOException, JAXBException, SQLException, ParseException {
+        super(parameterizedArray);
     }
     
     protected final void assertResultSet(final ResultSet resultSet) throws 
SQLException {
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dal/GeneralDALIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dal/GeneralDALIT.java
index d44d5f4..0a2b5d2 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dal/GeneralDALIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dal/GeneralDALIT.java
@@ -18,6 +18,8 @@
 package org.apache.shardingsphere.test.integration.engine.it.dal;
 
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
+import org.apache.shardingsphere.test.integration.engine.it.ParallelLevel;
+import org.apache.shardingsphere.test.integration.engine.it.RuntimeStrategy;
 import 
org.apache.shardingsphere.test.integration.engine.param.ParameterizedArrayFactory;
 import org.apache.shardingsphere.test.integration.engine.param.SQLExecuteType;
 import 
org.apache.shardingsphere.test.integration.engine.param.model.AssertionParameterizedArray;
@@ -38,16 +40,11 @@ import java.util.stream.Collectors;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
+@RuntimeStrategy(parallelLevel = ParallelLevel.SCENARIO)
 public final class GeneralDALIT extends BaseDALIT {
     
     public GeneralDALIT(final AssertionParameterizedArray parameterizedArray) 
throws IOException, JAXBException, SQLException, ParseException {
-        super(parameterizedArray.getTestCaseContext().getParentPath(),
-                parameterizedArray.getAssertion(),
-                parameterizedArray.getAdapter(),
-                parameterizedArray.getScenario(),
-                parameterizedArray.getDatabaseType(),
-                parameterizedArray.getSqlExecuteType(),
-                
parameterizedArray.getTestCaseContext().getTestCase().getSql());
+        super(parameterizedArray);
     }
     
     @Parameters(name = "{0}")
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dcl/BaseDCLIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dcl/BaseDCLIT.java
index a4f381b..8ab251c 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dcl/BaseDCLIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dcl/BaseDCLIT.java
@@ -19,10 +19,8 @@ package 
org.apache.shardingsphere.test.integration.engine.it.dcl;
 
 import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
 import 
org.apache.shardingsphere.infra.database.metadata.MemorizedDataSourceMetaData;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import 
org.apache.shardingsphere.test.integration.cases.assertion.IntegrationTestCaseAssertion;
 import org.apache.shardingsphere.test.integration.engine.it.SingleIT;
-import org.apache.shardingsphere.test.integration.engine.param.SQLExecuteType;
+import 
org.apache.shardingsphere.test.integration.engine.param.model.AssertionParameterizedArray;
 import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
 import 
org.apache.shardingsphere.test.integration.env.authority.AuthorityEnvironmentManager;
 import org.junit.After;
@@ -45,11 +43,10 @@ public abstract class BaseDCLIT extends SingleIT {
     
     private final AuthorityEnvironmentManager authorityEnvironmentManager;
     
-    protected BaseDCLIT(final String parentPath, final 
IntegrationTestCaseAssertion assertion, final String adapter, final String 
scenario,
-                        final DatabaseType databaseType, final SQLExecuteType 
sqlExecuteType, final String sql) throws IOException, JAXBException, 
SQLException, ParseException {
-        super(parentPath, assertion, adapter, scenario, databaseType, 
sqlExecuteType, sql);
+    protected BaseDCLIT(final AssertionParameterizedArray parameterizedArray) 
throws IOException, JAXBException, SQLException, ParseException {
+        super(parameterizedArray);
         authorityEnvironmentManager = new AuthorityEnvironmentManager(
-                EnvironmentPath.getAuthorityFile(scenario), null == 
getActualDataSources() ? null : createInstanceDataSourceMap(), databaseType);
+                
EnvironmentPath.getAuthorityFile(parameterizedArray.getScenario()), null == 
getActualDataSources() ? null : createInstanceDataSourceMap(), 
parameterizedArray.getDatabaseType());
     }
     
     private Map<String, DataSource> createInstanceDataSourceMap() throws 
SQLException {
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dcl/GeneralDCLIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dcl/GeneralDCLIT.java
index c6ac86b..ceb311c 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dcl/GeneralDCLIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dcl/GeneralDCLIT.java
@@ -18,6 +18,8 @@
 package org.apache.shardingsphere.test.integration.engine.it.dcl;
 
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
+import org.apache.shardingsphere.test.integration.engine.it.ParallelLevel;
+import org.apache.shardingsphere.test.integration.engine.it.RuntimeStrategy;
 import 
org.apache.shardingsphere.test.integration.engine.param.ParameterizedArrayFactory;
 import org.apache.shardingsphere.test.integration.engine.param.SQLExecuteType;
 import 
org.apache.shardingsphere.test.integration.engine.param.model.AssertionParameterizedArray;
@@ -31,16 +33,11 @@ import java.sql.SQLException;
 import java.text.ParseException;
 import java.util.Collection;
 
+@RuntimeStrategy(parallelLevel = ParallelLevel.SCENARIO)
 public final class GeneralDCLIT extends BaseDCLIT {
     
     public GeneralDCLIT(final AssertionParameterizedArray parameterizedArray) 
throws IOException, JAXBException, SQLException, ParseException {
-        super(parameterizedArray.getTestCaseContext().getParentPath(),
-                parameterizedArray.getAssertion(),
-                parameterizedArray.getAdapter(),
-                parameterizedArray.getScenario(),
-                parameterizedArray.getDatabaseType(),
-                parameterizedArray.getSqlExecuteType(),
-                
parameterizedArray.getTestCaseContext().getTestCase().getSql());
+        super(parameterizedArray);
     }
     
     @Parameters(name = "{0}")
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/ddl/BaseDDLIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/ddl/BaseDDLIT.java
index 4e1dbeb..38fe542 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/ddl/BaseDDLIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/ddl/BaseDDLIT.java
@@ -18,7 +18,6 @@
 package org.apache.shardingsphere.test.integration.engine.it.ddl;
 
 import com.google.common.base.Splitter;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.sharding.algorithm.sharding.inline.InlineExpressionParser;
 import 
org.apache.shardingsphere.sharding.route.engine.exception.NoSuchTableException;
@@ -27,7 +26,7 @@ import 
org.apache.shardingsphere.test.integration.cases.dataset.metadata.DataSet
 import 
org.apache.shardingsphere.test.integration.cases.dataset.metadata.DataSetIndex;
 import 
org.apache.shardingsphere.test.integration.cases.dataset.metadata.DataSetMetadata;
 import org.apache.shardingsphere.test.integration.engine.it.SingleIT;
-import org.apache.shardingsphere.test.integration.engine.param.SQLExecuteType;
+import 
org.apache.shardingsphere.test.integration.engine.param.model.AssertionParameterizedArray;
 import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
 import 
org.apache.shardingsphere.test.integration.env.dataset.DataSetEnvironmentManager;
 import org.junit.After;
@@ -57,10 +56,10 @@ public abstract class BaseDDLIT extends SingleIT {
     
     private final DataSetEnvironmentManager dataSetEnvironmentManager;
     
-    protected BaseDDLIT(final String parentPath, final 
IntegrationTestCaseAssertion assertion, final String adapter, final String 
scenario,
-                        final DatabaseType databaseType, final SQLExecuteType 
sqlExecuteType, final String sql) throws IOException, JAXBException, 
SQLException, ParseException {
-        super(parentPath, assertion, adapter, scenario, databaseType, 
sqlExecuteType, sql);
-        dataSetEnvironmentManager = new 
DataSetEnvironmentManager(EnvironmentPath.getDataSetFile(scenario), 
getActualDataSources());
+    protected BaseDDLIT(final AssertionParameterizedArray parameterizedArray) 
throws IOException, JAXBException, SQLException, ParseException {
+        super(parameterizedArray);
+        dataSetEnvironmentManager = new 
DataSetEnvironmentManager(EnvironmentPath.getDataSetFile(parameterizedArray.getScenario()),
 getActualDataSources());
+        IntegrationTestCaseAssertion assertion = 
parameterizedArray.getAssertion();
         assertNotNull("Expected affected table is required", 
assertion.getInitialSQL());
         assertNotNull("Expected affected table is required", 
assertion.getInitialSQL().getAffectedTable());
     }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/ddl/GeneralDDLIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/ddl/GeneralDDLIT.java
index 89ee6fd..73cd9c8 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/ddl/GeneralDDLIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/ddl/GeneralDDLIT.java
@@ -18,6 +18,8 @@
 package org.apache.shardingsphere.test.integration.engine.it.ddl;
 
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
+import org.apache.shardingsphere.test.integration.engine.it.ParallelLevel;
+import org.apache.shardingsphere.test.integration.engine.it.RuntimeStrategy;
 import 
org.apache.shardingsphere.test.integration.engine.param.ParameterizedArrayFactory;
 import org.apache.shardingsphere.test.integration.engine.param.SQLExecuteType;
 import 
org.apache.shardingsphere.test.integration.engine.param.model.AssertionParameterizedArray;
@@ -31,16 +33,11 @@ import java.sql.SQLException;
 import java.text.ParseException;
 import java.util.Collection;
 
+@RuntimeStrategy(parallelLevel = ParallelLevel.SCENARIO)
 public final class GeneralDDLIT extends BaseDDLIT {
     
     public GeneralDDLIT(final AssertionParameterizedArray parameterizedArray) 
throws IOException, JAXBException, SQLException, ParseException {
-        super(parameterizedArray.getTestCaseContext().getParentPath(),
-                parameterizedArray.getAssertion(),
-                parameterizedArray.getAdapter(),
-                parameterizedArray.getScenario(),
-                parameterizedArray.getDatabaseType(),
-                parameterizedArray.getSqlExecuteType(),
-                
parameterizedArray.getTestCaseContext().getTestCase().getSql());
+        super(parameterizedArray);
     }
     
     @Parameters(name = "{0}")
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/AdditionalDMLIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/AdditionalDMLIT.java
index 8ceacb4..78dbd6b 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/AdditionalDMLIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/AdditionalDMLIT.java
@@ -20,6 +20,8 @@ package 
org.apache.shardingsphere.test.integration.engine.it.dml;
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import 
org.apache.shardingsphere.test.integration.cases.assertion.IntegrationTestCaseAssertion;
 import org.apache.shardingsphere.test.integration.cases.value.SQLValue;
+import org.apache.shardingsphere.test.integration.engine.it.ParallelLevel;
+import org.apache.shardingsphere.test.integration.engine.it.RuntimeStrategy;
 import 
org.apache.shardingsphere.test.integration.engine.param.ParameterizedArrayFactory;
 import org.apache.shardingsphere.test.integration.engine.param.SQLExecuteType;
 import 
org.apache.shardingsphere.test.integration.engine.param.model.AssertionParameterizedArray;
@@ -39,18 +41,13 @@ import java.util.Collections;
 
 import static org.junit.Assert.assertFalse;
 
+@RuntimeStrategy(parallelLevel = ParallelLevel.SCENARIO)
 public final class AdditionalDMLIT extends BaseDMLIT {
     
     private final IntegrationTestCaseAssertion assertion;
     
     public AdditionalDMLIT(final AssertionParameterizedArray 
parameterizedArray) throws IOException, JAXBException, SQLException, 
ParseException {
-        super(parameterizedArray.getTestCaseContext().getParentPath(),
-                parameterizedArray.getAssertion(),
-                parameterizedArray.getAdapter(),
-                parameterizedArray.getScenario(),
-                parameterizedArray.getDatabaseType(),
-                parameterizedArray.getSqlExecuteType(),
-                
parameterizedArray.getTestCaseContext().getTestCase().getSql());
+        super(parameterizedArray);
         assertion = parameterizedArray.getAssertion();
     }
     
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/BaseDMLIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/BaseDMLIT.java
index 1b7e6e7..60d1795 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/BaseDMLIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/BaseDMLIT.java
@@ -17,16 +17,14 @@
 
 package org.apache.shardingsphere.test.integration.engine.it.dml;
 
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.sharding.algorithm.sharding.inline.InlineExpressionParser;
-import 
org.apache.shardingsphere.test.integration.cases.assertion.IntegrationTestCaseAssertion;
 import 
org.apache.shardingsphere.test.integration.cases.dataset.metadata.DataSetColumn;
 import 
org.apache.shardingsphere.test.integration.cases.dataset.metadata.DataSetMetadata;
 import org.apache.shardingsphere.test.integration.cases.dataset.row.DataSetRow;
 import org.apache.shardingsphere.test.integration.engine.it.SingleIT;
-import org.apache.shardingsphere.test.integration.engine.param.SQLExecuteType;
+import 
org.apache.shardingsphere.test.integration.engine.param.model.AssertionParameterizedArray;
 import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
 import 
org.apache.shardingsphere.test.integration.env.dataset.DataSetEnvironmentManager;
 import org.junit.After;
@@ -53,10 +51,9 @@ public abstract class BaseDMLIT extends SingleIT {
     
     private final DataSetEnvironmentManager dataSetEnvironmentManager;
     
-    protected BaseDMLIT(final String parentPath, final 
IntegrationTestCaseAssertion assertion, final String adapter, final String 
scenario,
-                        final DatabaseType databaseType, final SQLExecuteType 
sqlExecuteType, final String sql) throws IOException, JAXBException, 
SQLException, ParseException {
-        super(parentPath, assertion, adapter, scenario, databaseType, 
sqlExecuteType, sql);
-        dataSetEnvironmentManager = new 
DataSetEnvironmentManager(EnvironmentPath.getDataSetFile(scenario), 
getActualDataSources());
+    protected BaseDMLIT(final AssertionParameterizedArray parameterizedArray) 
throws IOException, JAXBException, SQLException, ParseException {
+        super(parameterizedArray);
+        dataSetEnvironmentManager = new 
DataSetEnvironmentManager(EnvironmentPath.getDataSetFile(parameterizedArray.getScenario()),
 getActualDataSources());
     }
     
     @Before
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/BatchDMLIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/BatchDMLIT.java
index c6b31b5..1c25b37 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/BatchDMLIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/BatchDMLIT.java
@@ -22,6 +22,8 @@ import 
org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import 
org.apache.shardingsphere.test.integration.cases.assertion.IntegrationTestCaseAssertion;
 import org.apache.shardingsphere.test.integration.cases.value.SQLValue;
 import org.apache.shardingsphere.test.integration.engine.it.BatchIT;
+import org.apache.shardingsphere.test.integration.engine.it.ParallelLevel;
+import org.apache.shardingsphere.test.integration.engine.it.RuntimeStrategy;
 import 
org.apache.shardingsphere.test.integration.engine.param.ParameterizedArrayFactory;
 import 
org.apache.shardingsphere.test.integration.engine.param.model.CaseParameterizedArray;
 import org.junit.Test;
@@ -38,16 +40,13 @@ import java.util.Collection;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
+@RuntimeStrategy(parallelLevel = ParallelLevel.SCENARIO)
 public final class BatchDMLIT extends BatchIT {
     
     private final IntegrationTestCaseContext testCaseContext;
     
     public BatchDMLIT(final CaseParameterizedArray parameterizedArray) throws 
IOException, JAXBException, SQLException {
-        super(parameterizedArray.getTestCaseContext(),
-                parameterizedArray.getAdapter(),
-                parameterizedArray.getScenario(),
-                parameterizedArray.getDatabaseType(),
-                
parameterizedArray.getTestCaseContext().getTestCase().getSql());
+        super(parameterizedArray);
         testCaseContext = parameterizedArray.getTestCaseContext();
     }
     
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/GeneralDMLIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/GeneralDMLIT.java
index 95c7c28..5f636f5 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/GeneralDMLIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dml/GeneralDMLIT.java
@@ -20,6 +20,8 @@ package 
org.apache.shardingsphere.test.integration.engine.it.dml;
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import 
org.apache.shardingsphere.test.integration.cases.assertion.IntegrationTestCaseAssertion;
 import org.apache.shardingsphere.test.integration.cases.value.SQLValue;
+import org.apache.shardingsphere.test.integration.engine.it.ParallelLevel;
+import org.apache.shardingsphere.test.integration.engine.it.RuntimeStrategy;
 import 
org.apache.shardingsphere.test.integration.engine.param.ParameterizedArrayFactory;
 import org.apache.shardingsphere.test.integration.engine.param.SQLExecuteType;
 import 
org.apache.shardingsphere.test.integration.engine.param.model.AssertionParameterizedArray;
@@ -37,18 +39,13 @@ import java.util.Collection;
 
 import static org.junit.Assert.assertFalse;
 
+@RuntimeStrategy(parallelLevel = ParallelLevel.SCENARIO)
 public final class GeneralDMLIT extends BaseDMLIT {
     
     private final IntegrationTestCaseAssertion assertion;
     
     public GeneralDMLIT(final AssertionParameterizedArray parameterizedArray) 
throws IOException, JAXBException, SQLException, ParseException {
-        super(parameterizedArray.getTestCaseContext().getParentPath(),
-                parameterizedArray.getAssertion(),
-                parameterizedArray.getAdapter(),
-                parameterizedArray.getScenario(),
-                parameterizedArray.getDatabaseType(),
-                parameterizedArray.getSqlExecuteType(),
-                
parameterizedArray.getTestCaseContext().getTestCase().getSql());
+        super(parameterizedArray);
         assertion = parameterizedArray.getAssertion();
     }
     
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dql/AdditionalDQLIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dql/AdditionalDQLIT.java
index 3ffa29a..0c9cf60 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dql/AdditionalDQLIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dql/AdditionalDQLIT.java
@@ -20,6 +20,8 @@ package 
org.apache.shardingsphere.test.integration.engine.it.dql;
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import 
org.apache.shardingsphere.test.integration.cases.assertion.IntegrationTestCaseAssertion;
 import org.apache.shardingsphere.test.integration.cases.value.SQLValue;
+import org.apache.shardingsphere.test.integration.engine.it.ParallelLevel;
+import org.apache.shardingsphere.test.integration.engine.it.RuntimeStrategy;
 import 
org.apache.shardingsphere.test.integration.engine.param.ParameterizedArrayFactory;
 import org.apache.shardingsphere.test.integration.engine.param.SQLExecuteType;
 import 
org.apache.shardingsphere.test.integration.engine.param.model.AssertionParameterizedArray;
@@ -40,18 +42,13 @@ import java.util.Collections;
 
 import static org.junit.Assert.assertTrue;
 
+@RuntimeStrategy(parallelLevel = ParallelLevel.CASE)
 public final class AdditionalDQLIT extends BaseDQLIT {
     
     private final IntegrationTestCaseAssertion assertion;
     
     public AdditionalDQLIT(final AssertionParameterizedArray 
parameterizedArray) throws IOException, JAXBException, SQLException, 
ParseException {
-        super(parameterizedArray.getTestCaseContext().getParentPath(),
-                parameterizedArray.getAssertion(),
-                parameterizedArray.getAdapter(),
-                parameterizedArray.getScenario(),
-                parameterizedArray.getDatabaseType(),
-                parameterizedArray.getSqlExecuteType(),
-                
parameterizedArray.getTestCaseContext().getTestCase().getSql());
+        super(parameterizedArray);
         assertion = parameterizedArray.getAssertion();
     }
     
@@ -72,9 +69,8 @@ public final class AdditionalDQLIT extends BaseDQLIT {
     }
     
     private void 
assertExecuteQueryForStatementWithResultSetTypeAndResultSetConcurrency(final 
Connection connection) throws SQLException, ParseException {
-        try (
-                Statement statement = 
connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, 
ResultSet.CONCUR_READ_ONLY);
-                ResultSet resultSet = 
statement.executeQuery(String.format(getSql(), 
assertion.getSQLValues().toArray()))) {
+        try (Statement statement = 
connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, 
ResultSet.CONCUR_READ_ONLY);
+             ResultSet resultSet = 
statement.executeQuery(String.format(getSql(), 
assertion.getSQLValues().toArray()))) {
             assertResultSet(resultSet);
         }
     }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dql/BaseDQLIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dql/BaseDQLIT.java
index 6375b8a..1cfea31 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dql/BaseDQLIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dql/BaseDQLIT.java
@@ -18,12 +18,11 @@
 package org.apache.shardingsphere.test.integration.engine.it.dql;
 
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import 
org.apache.shardingsphere.test.integration.cases.assertion.IntegrationTestCaseAssertion;
 import 
org.apache.shardingsphere.test.integration.cases.dataset.metadata.DataSetColumn;
 import 
org.apache.shardingsphere.test.integration.cases.dataset.metadata.DataSetMetadata;
 import org.apache.shardingsphere.test.integration.cases.dataset.row.DataSetRow;
 import org.apache.shardingsphere.test.integration.engine.it.SingleIT;
-import org.apache.shardingsphere.test.integration.engine.param.SQLExecuteType;
+import 
org.apache.shardingsphere.test.integration.engine.param.model.AssertionParameterizedArray;
 import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
 import 
org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
 import 
org.apache.shardingsphere.test.integration.env.dataset.DataSetEnvironmentManager;
@@ -48,9 +47,8 @@ import static org.junit.Assert.assertTrue;
 
 public abstract class BaseDQLIT extends SingleIT {
     
-    protected BaseDQLIT(final String parentPath, final 
IntegrationTestCaseAssertion assertion, final String adapter, final String 
scenario,
-                        final DatabaseType databaseType, final SQLExecuteType 
sqlExecuteType, final String sql) throws IOException, JAXBException, 
SQLException, ParseException {
-        super(parentPath, assertion, adapter, scenario, databaseType, 
sqlExecuteType, sql);
+    protected BaseDQLIT(final AssertionParameterizedArray parameterizedArray) 
throws IOException, JAXBException, SQLException, ParseException {
+        super(parameterizedArray);
     }
     
     @BeforeClass
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dql/GeneralDQLIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dql/GeneralDQLIT.java
index 6ade722..1266648 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dql/GeneralDQLIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/dql/GeneralDQLIT.java
@@ -20,6 +20,8 @@ package 
org.apache.shardingsphere.test.integration.engine.it.dql;
 import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
 import 
org.apache.shardingsphere.test.integration.cases.assertion.IntegrationTestCaseAssertion;
 import org.apache.shardingsphere.test.integration.cases.value.SQLValue;
+import org.apache.shardingsphere.test.integration.engine.it.ParallelLevel;
+import org.apache.shardingsphere.test.integration.engine.it.RuntimeStrategy;
 import 
org.apache.shardingsphere.test.integration.engine.param.ParameterizedArrayFactory;
 import org.apache.shardingsphere.test.integration.engine.param.SQLExecuteType;
 import 
org.apache.shardingsphere.test.integration.engine.param.model.AssertionParameterizedArray;
@@ -38,18 +40,13 @@ import java.util.Collection;
 
 import static org.junit.Assert.assertTrue;
 
+@RuntimeStrategy(parallelLevel = ParallelLevel.CASE)
 public final class GeneralDQLIT extends BaseDQLIT {
     
     private final IntegrationTestCaseAssertion assertion;
     
     public GeneralDQLIT(final AssertionParameterizedArray parameterizedArray) 
throws IOException, JAXBException, SQLException, ParseException {
-        super(parameterizedArray.getTestCaseContext().getParentPath(),
-                parameterizedArray.getAssertion(),
-                parameterizedArray.getAdapter(),
-                parameterizedArray.getScenario(),
-                parameterizedArray.getDatabaseType(),
-                parameterizedArray.getSqlExecuteType(),
-                
parameterizedArray.getTestCaseContext().getTestCase().getSql());
+        super(parameterizedArray);
         assertion = parameterizedArray.getAssertion();
     }
     
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/ParallelParameterized.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITParameterized.java
similarity index 61%
rename from 
shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/ParallelParameterized.java
rename to 
shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITParameterized.java
index acd5729..6288c64 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/ParallelParameterized.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITParameterized.java
@@ -15,19 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.test.integration.engine.junit.parallel;
+package org.apache.shardingsphere.test.integration.engine.junit;
 
+import org.apache.shardingsphere.test.integration.engine.it.RuntimeStrategy;
+import 
org.apache.shardingsphere.test.integration.engine.junit.parallel.ParallelRunnerScheduler;
 import org.junit.runners.Parameterized;
 
 /**
- * Parallel parameterized.
+ * IT parameterized.
  */
-public final class ParallelParameterized extends Parameterized {
+public final class ITParameterized extends Parameterized {
     
     //CHECKSTYLE:OFF
-    public ParallelParameterized(final Class<?> klass) throws Throwable {
+    public ITParameterized(final Class<?> klass) throws Throwable {
         //CHECKSTYLE:ON
         super(klass);
-        setScheduler(new ParallelRunnerScheduler());
+        RuntimeStrategy runtimeStrategy = 
klass.getAnnotation(RuntimeStrategy.class);
+        if (null != runtimeStrategy) {
+            setScheduler(new ParallelRunnerScheduler(runtimeStrategy));
+        }
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/ParallelRunnerScheduler.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/ParallelRunnerScheduler.java
index 1523987..2b8712a 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/ParallelRunnerScheduler.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/ParallelRunnerScheduler.java
@@ -17,19 +17,21 @@
 
 package org.apache.shardingsphere.test.integration.engine.junit.parallel;
 
+import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import org.apache.shardingsphere.test.integration.cases.SQLCommandType;
+import org.apache.shardingsphere.test.integration.engine.it.RuntimeStrategy;
 import 
org.apache.shardingsphere.test.integration.engine.junit.parallel.impl.CaseParallelRunnerExecutor;
 import 
org.apache.shardingsphere.test.integration.engine.junit.parallel.impl.ScenarioParallelRunnerExecutor;
 import 
org.apache.shardingsphere.test.integration.engine.param.model.ParameterizedArray;
-import 
org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
 import org.junit.runners.model.RunnerScheduler;
 import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters;
 
 import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 /**
  * Parallel runner scheduler.
@@ -38,13 +40,17 @@ public final class ParallelRunnerScheduler implements 
RunnerScheduler {
     
     private final Field parametersField;
     
-    private final Map<String, ParallelRunnerExecutor> runnerExecutors;
+    private final ConcurrentMap<RunnerExecutorKey, ParallelRunnerExecutor> 
runnerExecutors = new ConcurrentHashMap<>();
+    
+    private final RuntimeStrategy runtimeStrategy;
     
     private volatile Field runnerField;
     
-    public ParallelRunnerScheduler() {
+    private final Lock lock = new ReentrantLock();
+    
+    public ParallelRunnerScheduler(final RuntimeStrategy runtimeStrategy) {
+        this.runtimeStrategy = runtimeStrategy;
         parametersField = getParametersField();
-        runnerExecutors = getRunnerExecutors();
     }
     
     @SneakyThrows(NoSuchFieldException.class)
@@ -54,24 +60,11 @@ public final class ParallelRunnerScheduler implements 
RunnerScheduler {
         return result;
     }
     
-    private Map<String, ParallelRunnerExecutor> getRunnerExecutors() {
-        Map<String, ParallelRunnerExecutor> result = new 
HashMap<>(IntegrationTestEnvironment.getInstance().getDataSourceEnvironments().size()
 * 2, 1);
-        for (DatabaseType each : 
IntegrationTestEnvironment.getInstance().getDataSourceEnvironments().keySet()) {
-            result.put(getRunnerExecutorKey(each.getName(), 
SQLCommandType.DQL.name()), new CaseParallelRunnerExecutor());
-            result.put(getRunnerExecutorKey(each.getName(), ""), new 
ScenarioParallelRunnerExecutor());
-        }
-        return result;
-    }
-    
-    private String getRunnerExecutorKey(final String databaseType, final 
String sqlCommandType) {
-        return String.join("_", databaseType, sqlCommandType);
-    }
-    
     @Override
     public void schedule(final Runnable childStatement) {
         Object[] parameters = getParameters(childStatement);
         ParameterizedArray parameterizedArray = (ParameterizedArray) 
parameters[0];
-        getRunnerExecutor(parameterizedArray).execute(parameterizedArray, 
childStatement);
+        getRunnerExecutor(new 
RunnerExecutorKey(parameterizedArray.getDatabaseType())).execute(parameterizedArray,
 childStatement);
     }
     
     @SneakyThrows(ReflectiveOperationException.class)
@@ -83,10 +76,34 @@ public final class ParallelRunnerScheduler implements 
RunnerScheduler {
         return (Object[]) parametersField.get(runnerField.get(childStatement));
     }
     
-    private ParallelRunnerExecutor getRunnerExecutor(final ParameterizedArray 
parameterizedArray) {
-        return SQLCommandType.DQL == parameterizedArray.getSqlCommandType() 
-                ? 
runnerExecutors.get(getRunnerExecutorKey(parameterizedArray.getDatabaseType().getName(),
 SQLCommandType.DQL.name()))
-                : 
runnerExecutors.get(getRunnerExecutorKey(parameterizedArray.getDatabaseType().getName(),
 ""));
+    private ParallelRunnerExecutor getRunnerExecutor(final RunnerExecutorKey 
runnerExecutorKey) {
+        ParallelRunnerExecutor runnerExecutor = 
this.runnerExecutors.get(runnerExecutorKey);
+        if (null != runnerExecutor) {
+            return runnerExecutor;
+        }
+        try {
+            lock.lock();
+            runnerExecutor = this.runnerExecutors.get(runnerExecutorKey);
+            if (null != runnerExecutor) {
+                return runnerExecutor;
+            }
+            runnerExecutor = getRunnerExecutor();
+            this.runnerExecutors.put(runnerExecutorKey, runnerExecutor);
+            return runnerExecutor;
+        } finally {
+            lock.unlock();
+        }
+    }
+    
+    private ParallelRunnerExecutor getRunnerExecutor() {
+        switch (runtimeStrategy.parallelLevel()) {
+            case CASE:
+                return new CaseParallelRunnerExecutor();
+            case SCENARIO:
+                return new ScenarioParallelRunnerExecutor();
+            default:
+                throw new UnsupportedOperationException("Unsupported runtime 
strategy.");
+        }
     }
     
     @Override
@@ -95,4 +112,30 @@ public final class ParallelRunnerScheduler implements 
RunnerScheduler {
             runnerExecutors.values().forEach(ParallelRunnerExecutor::finished);
         }
     }
+    
+    /**
+     * Runner executor key.
+     */
+    @RequiredArgsConstructor
+    private static final class RunnerExecutorKey {
+        
+        private final DatabaseType databaseType;
+    
+        @Override
+        public boolean equals(final Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (o == null || getClass() != o.getClass()) {
+                return false;
+            }
+            RunnerExecutorKey that = (RunnerExecutorKey) o;
+            return databaseType.getName().equals(that.databaseType.getName());
+        }
+    
+        @Override
+        public int hashCode() {
+            return databaseType.hashCode();
+        }
+    }
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/impl/CaseParallelRunnerExecutor.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/impl/CaseParallelRunnerExecutor.java
index 7b0eb9d..eeabd10 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/impl/CaseParallelRunnerExecutor.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/impl/CaseParallelRunnerExecutor.java
@@ -17,31 +17,42 @@
 
 package org.apache.shardingsphere.test.integration.engine.junit.parallel.impl;
 
+import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.infra.executor.kernel.thread.ExecutorServiceManager;
 import 
org.apache.shardingsphere.test.integration.engine.junit.parallel.ParallelRunnerExecutor;
 import 
org.apache.shardingsphere.test.integration.engine.param.model.ParameterizedArray;
 
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.TimeUnit;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 
 /**
  * Parallel runner executor with case.
  */
+@RequiredArgsConstructor
 public final class CaseParallelRunnerExecutor implements 
ParallelRunnerExecutor {
     
     private final ExecutorServiceManager executorServiceManager = new 
ExecutorServiceManager(Runtime.getRuntime().availableProcessors() * 2 - 1);
     
+    private final List<Future<?>> caseTaskResults = new LinkedList<>();
+    
     @Override
     public void execute(final ParameterizedArray parameterizedArray, final 
Runnable childStatement) {
-        executorServiceManager.getExecutorService().submit(childStatement);
+        
caseTaskResults.add(executorServiceManager.getExecutorService().submit(() -> 
childStatement.run()));
     }
     
-    @SneakyThrows(InterruptedException.class)
+    @SneakyThrows
     @Override
     public void finished() {
-        ExecutorService executorService = 
executorServiceManager.getExecutorService();
-        executorService.shutdown();
-        executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
+        caseTaskResults.forEach(future -> {
+            try {
+                future.get();
+            } catch (InterruptedException ignore) {
+            } catch (ExecutionException ignore) {
+            }
+        });
+        executorServiceManager.getExecutorService().shutdownNow();
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/impl/ScenarioParallelRunnerExecutor.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/impl/ScenarioParallelRunnerExecutor.java
index a61b2b8..31b950d 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/impl/ScenarioParallelRunnerExecutor.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/parallel/impl/ScenarioParallelRunnerExecutor.java
@@ -17,30 +17,28 @@
 
 package org.apache.shardingsphere.test.integration.engine.junit.parallel.impl;
 
-import com.google.common.base.Charsets;
-import com.google.common.hash.Hasher;
-import com.google.common.hash.Hashing;
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
-import com.lmax.disruptor.BlockingWaitStrategy;
-import com.lmax.disruptor.EventFactory;
-import com.lmax.disruptor.EventHandler;
-import com.lmax.disruptor.RingBuffer;
-import com.lmax.disruptor.Sequence;
-import com.lmax.disruptor.SequenceReportingEventHandler;
-import com.lmax.disruptor.dsl.Disruptor;
-import com.lmax.disruptor.dsl.ProducerType;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import 
org.apache.shardingsphere.test.integration.engine.junit.parallel.ParallelRunnerExecutor;
 import 
org.apache.shardingsphere.test.integration.engine.param.model.ParameterizedArray;
-import 
org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
 
-import java.util.Collection;
+import java.io.Closeable;
+import java.io.IOException;
 import java.util.LinkedList;
-import java.util.concurrent.ThreadFactory;
-import java.util.stream.Collectors;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 /**
  * Parallel runner executor with scenario.
@@ -48,131 +46,121 @@ import java.util.stream.Collectors;
 @Slf4j
 public final class ScenarioParallelRunnerExecutor implements 
ParallelRunnerExecutor {
     
-    private final Disruptor<CaseEntryEvent> disruptor;
+    private final ConcurrentMap<ScenarioKey, ScenarioExecutorQueue> 
scenarioExecutorQueues = new ConcurrentHashMap<>();
     
-    private final RingBuffer<CaseEntryEvent> ringBuffer;
+    private final Lock lock = new ReentrantLock();
     
-    public ScenarioParallelRunnerExecutor() {
-        disruptor = createDisruptor();
-        disruptor.handleEventsWith(createEventHandlers()).then(new 
CleanupEventHandler());
-        disruptor.start();
-        ringBuffer = disruptor.getRingBuffer();
-    }
+    private final List<Future<?>> scenarioTaskResults = new LinkedList<>();
     
-    private Disruptor<CaseEntryEvent> createDisruptor() {
-        EventFactory<CaseEntryEvent> eventFactory = CaseEntryEvent::new;
-        ThreadFactory threadFactory = new ThreadFactoryBuilder()
-                
.setDaemon(false).setNameFormat("disruptor-processors-%d").setUncaughtExceptionHandler((thread,
 ex) -> log.error("Disruptor handler thread exception", ex)).build();
-        return new Disruptor<>(eventFactory, 16384, threadFactory, 
ProducerType.SINGLE, new BlockingWaitStrategy());
+    @Override
+    public void execute(final ParameterizedArray parameterizedArray, final 
Runnable childStatement) {
+        scenarioTaskResults.add(getScenarioExecutorQueue(new 
ScenarioKey(parameterizedArray.getAdapter(), parameterizedArray.getScenario(), 
parameterizedArray.getDatabaseType().getName()))
+                .submit(childStatement));
     }
     
-    private CaseEventHandler[] createEventHandlers() {
-        Collection<CaseEventHandler> result = new LinkedList<>();
-        for (String each : 
IntegrationTestEnvironment.getInstance().getAdapters()) {
-            result.addAll(createEventHandlers(each, 
IntegrationTestEnvironment.getInstance().getScenarios(), 
IntegrationTestEnvironment.getInstance().getDataSourceEnvironments().keySet()));
+    private ScenarioExecutorQueue getScenarioExecutorQueue(final ScenarioKey 
scenarioKey) {
+        ScenarioExecutorQueue scenarioExecutorQueue = 
this.scenarioExecutorQueues.get(scenarioKey);
+        if (null != scenarioExecutorQueue) {
+            return scenarioExecutorQueue;
         }
-        return result.toArray(new CaseEventHandler[0]);
-    }
-    
-    private Collection<CaseEventHandler> createEventHandlers(final String 
adapter, final Collection<String> scenarios, final Collection<DatabaseType> 
databaseTypes) {
-        Collection<CaseEventHandler> result = new LinkedList<>();
-        for (String each : scenarios) {
-            result.addAll(createEventHandlers(adapter, each, databaseTypes));
+        try {
+            lock.lock();
+            scenarioExecutorQueue = 
this.scenarioExecutorQueues.get(scenarioKey);
+            if (null != scenarioExecutorQueue) {
+                return scenarioExecutorQueue;
+            }
+            scenarioExecutorQueue = new ScenarioExecutorQueue(scenarioKey);
+            this.scenarioExecutorQueues.put(scenarioKey, 
scenarioExecutorQueue);
+            return scenarioExecutorQueue;
+        } finally {
+            lock.unlock();
         }
-        return result;
-    }
-    
-    private Collection<CaseEventHandler> createEventHandlers(final String 
adapter, final String scenario, final Collection<DatabaseType> databaseTypes) {
-        return databaseTypes.stream().map(each -> new CaseEventHandler(new 
CaseKey(adapter, scenario, 
each.getName()).hashCode())).collect(Collectors.toList());
-    }
-    
-    @Override
-    public void execute(final ParameterizedArray parameterizedArray, final 
Runnable childStatement) {
-        // TODO disruptor cannot shutdown gracefully, the test case will not 
block and will next test cases (for example: DQL). Just use sync run, need to 
FIXME here.
-        childStatement.run();
-//        ringBuffer.publishEvent((event, sequence) -> {
-//            event.reset();
-//            event.setCaseKey(new CaseKey(parameterizedArray.getAdapter(), 
parameterizedArray.getScenario(), 
parameterizedArray.getDatabaseType().getName()));
-//            event.setChildStatement(childStatement);
-//        });
     }
     
     @Override
     public void finished() {
-        if (null != disruptor) {
-            disruptor.shutdown();
-        }
+        scenarioTaskResults.forEach(future -> {
+            try {
+                future.get();
+            } catch (InterruptedException ignore) {
+            } catch (ExecutionException ignore) {
+            }
+        });
+        scenarioExecutorQueues.values().forEach(scenarioExecutorQueue -> {
+            try {
+                scenarioExecutorQueue.close();
+            } catch (IOException ignore) {
+            }
+        });
     }
     
+    /**
+     * Scenario key.
+     */
     @RequiredArgsConstructor
-    private static final class CaseKey {
+    private static final class ScenarioKey {
         
         private final String adapter;
         
         private final String scenario;
         
         private final String databaseTypeName;
-        
+    
         @Override
-        public int hashCode() {
-            Hasher hasher = Hashing.murmur3_32().newHasher();
-            hasher.putString(adapter, Charsets.UTF_8);
-            hasher.putString(scenario, Charsets.UTF_8);
-            hasher.putString(databaseTypeName, Charsets.UTF_8);
-            return hasher.hash().asInt();
+        public boolean equals(final Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (o == null || getClass() != o.getClass()) {
+                return false;
+            }
+            ScenarioKey that = (ScenarioKey) o;
+            if (!adapter.equals(that.adapter)) {
+                return false;
+            }
+            if (!scenario.equals(that.scenario)) {
+                return false;
+            }
+            return databaseTypeName.equals(that.databaseTypeName);
         }
-    }
     
-    /**
-     * Case entry event.
-     */
-    @Setter
-    private static final class CaseEntryEvent {
-        
-        private CaseKey caseKey;
-        
-        private Runnable childStatement;
-        
         @Override
         public int hashCode() {
-            return caseKey.hashCode();
+            int result = adapter.hashCode();
+            result = 31 * result + scenario.hashCode();
+            result = 31 * result + databaseTypeName.hashCode();
+            return result;
         }
-        
-        public void reset() {
-            caseKey = null;
-            childStatement = null;
+    
+        @Override
+        public String toString() {
+            return String.join("-", adapter, scenario, databaseTypeName);
         }
     }
     
-    @RequiredArgsConstructor
-    private static final class CaseEventHandler implements 
SequenceReportingEventHandler<CaseEntryEvent> {
-        
-        private final int hashCode;
-        
-        private Sequence reportingSequence;
+    /**
+     * Scenario executor queue.
+     */
+    @Setter
+    private static final class ScenarioExecutorQueue implements Closeable {
         
-        @Override
-        public void onEvent(final CaseEntryEvent event, final long sequence, 
final boolean endOfBatch) {
-            if (null == event.caseKey || event.hashCode() != hashCode) {
-                return;
-            }
-            event.childStatement.run();
-            if (null != reportingSequence) {
-                reportingSequence.set(sequence);
-            }
+        private final BlockingQueue<Runnable> executorQueue;
+    
+        private final ExecutorService executorService;
+    
+        ScenarioExecutorQueue(final ScenarioKey scenarioKey) {
+            this.executorQueue = new LinkedBlockingQueue<>();
+            this.executorService = new ThreadPoolExecutor(1, 1, 0L, 
TimeUnit.MILLISECONDS,
+                    this.executorQueue, new 
ThreadFactoryBuilder().setNameFormat("ScenarioExecutor-" + scenarioKey + 
"-pool-%d").build());
         }
-        
-        @Override
-        public void setSequenceCallback(final Sequence sequenceCallback) {
-            reportingSequence = sequenceCallback;
+    
+        public Future<?> submit(final Runnable childStatement) {
+            return this.executorService.submit(childStatement);
         }
-    }
     
-    private static final class CleanupEventHandler implements 
EventHandler<CaseEntryEvent> {
-        
         @Override
-        public void onEvent(final CaseEntryEvent event, final long sequence, 
final boolean endOfBatch) {
-            event.reset();
+        public void close() throws IOException {
+            this.executorService.shutdownNow();
         }
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/IntegrationTestEnvironment.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/IntegrationTestEnvironment.java
index ed84a7a..eb29c7a 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/IntegrationTestEnvironment.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/IntegrationTestEnvironment.java
@@ -40,6 +40,7 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -58,7 +59,7 @@ public final class IntegrationTestEnvironment {
     
     private final boolean runAdditionalTestCases;
     
-    private final Map<DatabaseType, Map<String, DataSourceEnvironment>> 
dataSourceEnvironments;
+    private Map<DatabaseType, Map<String, DataSourceEnvironment>> 
dataSourceEnvironments;
     
     private final Map<String, DataSourceEnvironment> proxyEnvironments;
     
@@ -71,7 +72,9 @@ public final class IntegrationTestEnvironment {
         Map<String, DatabaseScenarioProperties> databaseProps = 
getDatabaseScenarioProperties();
         dataSourceEnvironments = 
createDataSourceEnvironments(getDatabaseTypes(engineEnvProps), databaseProps);
         if (EnvironmentType.EMBEDDED == envType) {
-            createEmbeddedDatabases(new 
EmbeddedDatabaseDistributionProperties(EnvironmentProperties.loadProperties("env/embedded-databases.properties")));
+            EmbeddedDatabaseDistributionProperties embeddedDatabaseProps = new 
EmbeddedDatabaseDistributionProperties(EnvironmentProperties.loadProperties("env/embedded-databases.properties"));
+            dataSourceEnvironments = 
mergeDataSourceEnvironments(embeddedDatabaseProps);
+            createEmbeddedDatabases(embeddedDatabaseProps);
         }
         proxyEnvironments = createProxyEnvironments(databaseProps);
         if (EnvironmentType.DOCKER == envType) {
@@ -130,6 +133,28 @@ public final class IntegrationTestEnvironment {
                 databaseProps.getDatabasePort(databaseType), 
databaseProps.getDatabaseUsername(databaseType), 
databaseProps.getDatabasePassword(databaseType));
     }
     
+    private Map<DatabaseType, Map<String, DataSourceEnvironment>> 
mergeDataSourceEnvironments(final EmbeddedDatabaseDistributionProperties 
embeddedDatabaseProps) {
+        Set<DatabaseType> databaseTypes = dataSourceEnvironments.keySet();
+        Map<DatabaseType, Map<String, DataSourceEnvironment>> result = new 
LinkedHashMap<>(databaseTypes.size(), 1);
+        for (DatabaseType each : databaseTypes) {
+            Map<String, DataSourceEnvironment> dataSourceEnvs = new 
LinkedHashMap<>(scenarios.size(), 1);
+            for (String scenario : scenarios) {
+                dataSourceEnvs.put(scenario, 
mergeDataSourceEnvironment(dataSourceEnvironments.get(each).get(scenario), 
embeddedDatabaseProps));
+                result.put(each, dataSourceEnvs);
+            }
+        }
+        return result;
+    }
+    
+    private DataSourceEnvironment mergeDataSourceEnvironment(final 
DataSourceEnvironment dataSourceEnvironment, final 
EmbeddedDatabaseDistributionProperties embeddedDatabaseProps) {
+        DatabaseType databaseType = dataSourceEnvironment.getDatabaseType();
+        if (databaseType instanceof H2DatabaseType) {
+            return new DataSourceEnvironment(databaseType, "", 0, "sa", "");
+        }
+        return new DataSourceEnvironment(databaseType, 
dataSourceEnvironment.getHost(),
+                embeddedDatabaseProps.getInstancePort(databaseType), 
dataSourceEnvironment.getUsername(), dataSourceEnvironment.getPassword());
+    }
+    
     private void createEmbeddedDatabases(final 
EmbeddedDatabaseDistributionProperties embeddedDatabaseProps) {
         for (Entry<DatabaseType, Map<String, DataSourceEnvironment>> entry : 
dataSourceEnvironments.entrySet()) {
             createEmbeddedDatabases(entry.getKey(), entry.getValue(), 
embeddedDatabaseProps);
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/database/embedded/EmbeddedDatabaseDistributionProperties.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/database/embedded/EmbeddedDatabaseDistributionProperties.java
index 5980210..6d1d6ed 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/database/embedded/EmbeddedDatabaseDistributionProperties.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/database/embedded/EmbeddedDatabaseDistributionProperties.java
@@ -49,4 +49,14 @@ public final class EmbeddedDatabaseDistributionProperties {
     public String getVersion(final DatabaseType databaseType) {
         return props.getProperty(String.format("it.%s.distribution.version", 
databaseType.getName().toLowerCase()));
     }
+    
+    /**
+     * Get database port.
+     *
+     * @param databaseType database type
+     * @return database port
+     */
+    public int getInstancePort(final DatabaseType databaseType) {
+        return 
Integer.parseInt(props.getProperty(String.format("it.%s.instance.port", 
databaseType.getName().toLowerCase())));
+    }
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/database/embedded/EmbeddedDatabaseManager.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/database/embedded/EmbeddedDatabaseManager.java
index 21db9f3..77fe115 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/database/embedded/EmbeddedDatabaseManager.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/env/database/embedded/EmbeddedDatabaseManager.java
@@ -22,7 +22,6 @@ import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.infra.database.type.dialect.H2DatabaseType;
-import 
org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
 import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.infra.spi.typed.TypedSPIRegistry;
 
@@ -59,13 +58,7 @@ public final class EmbeddedDatabaseManager {
         if (databaseTypeImpl instanceof H2DatabaseType) {
             return;
         }
-        // TODO This can be a single instance if the GitHub Action port has 
been adjusted
-        String embeddedDatabaseKey;
-        if (databaseTypeImpl instanceof PostgreSQLDatabaseType) {
-            embeddedDatabaseKey = databaseType;
-        } else {
-            embeddedDatabaseKey = String.join("_", databaseType, scenario);
-        }
+        String embeddedDatabaseKey = databaseType;
         if (EMBEDDED_DATABASES_CACHE.containsKey(embeddedDatabaseKey)) {
             return;
         }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/embedded-databases.properties
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/embedded-databases.properties
index a167cb9..6092c2b 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/embedded-databases.properties
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/embedded-databases.properties
@@ -27,6 +27,7 @@ it.mysql.distribution.url=https://dev.mysql.com/get/Downloads
 # 10.13        v8_0_11
 # 10.14|10.15  v5_7_27
 it.mysql.distribution.version=
+it.mysql.instance.port=6033
 
 it.postgresql.distribution.url=https://get.enterprisedb.com/postgresql/
 # V11_1: on Mac OS X and Windows 64 bit
@@ -35,3 +36,4 @@ 
it.postgresql.distribution.url=https://get.enterprisedb.com/postgresql/
 # 10.10-10.12  V9_6_11|V10_6
 # 10.12-10.14  V11_1
 it.postgresql.distribution.version=
+it.postgresql.instance.port=5432

Reply via email to