diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/config/ShardingPropertiesConstant.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/config/ShardingPropertiesConstant.java index d5636b92e3c8f..577be9d35d1e0 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/config/ShardingPropertiesConstant.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/config/ShardingPropertiesConstant.java @@ -70,10 +70,10 @@ public enum ShardingPropertiesConstant { * 最大工作线程数量. * *

- * 默认值: CPU的核数 * 2 + * 默认值: 100 *

*/ - EXECUTOR_MAX_SIZE("executor.max.size", String.valueOf(Runtime.getRuntime().availableProcessors() * 2), int.class), + EXECUTOR_MAX_SIZE("executor.max.size", "100", int.class), /** * 工作线程空闲时超时时间. diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/ExecutorEngine.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/ExecutorEngine.java index e5ff2d5fba7a2..1f0029cf974cc 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/ExecutorEngine.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/executor/ExecutorEngine.java @@ -19,6 +19,7 @@ import com.dangdang.ddframe.rdb.sharding.config.ShardingProperties; import com.dangdang.ddframe.rdb.sharding.config.ShardingPropertiesConstant; +import com.dangdang.ddframe.rdb.sharding.exception.ShardingJdbcException; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -32,7 +33,7 @@ import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; -import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -51,7 +52,7 @@ public ExecutorEngine(final ShardingProperties shardingProperties) { int executorMaxSize = shardingProperties.getValue(ShardingPropertiesConstant.EXECUTOR_MAX_SIZE); long executorMaxIdleTimeoutMilliseconds = shardingProperties.getValue(ShardingPropertiesConstant.EXECUTOR_MAX_IDLE_TIMEOUT_MILLISECONDS); executorService = MoreExecutors.listeningDecorator(MoreExecutors.getExitingExecutorService( - new ThreadPoolExecutor(executorMinIdleSize, executorMaxSize, executorMaxIdleTimeoutMilliseconds, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()))); + new ThreadPoolExecutor(executorMinIdleSize, executorMaxSize, executorMaxIdleTimeoutMilliseconds, TimeUnit.MILLISECONDS, new SynchronousQueue()))); } /** @@ -84,6 +85,20 @@ public O execute(final Collection inputs, final ExecuteUnit e return mergeUnit.merge(execute(inputs, executeUnit)); } + /** + * 安全关闭执行器,并释放线程. + */ + public void shutdown() { + executorService.shutdownNow(); + try { + executorService.awaitTermination(5, TimeUnit.SECONDS); + } catch (final InterruptedException ignored) { + } + if (!executorService.isTerminated()) { + throw new ShardingJdbcException("ExecutorEngine can not been terminated"); + } + } + private ListenableFuture> submitFutures(final Collection inputs, final ExecuteUnit executeUnit) { Set> result = new HashSet<>(inputs.size()); for (final I each : inputs) { diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingDataSource.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingDataSource.java index 920cba2331d59..2abd87758e5be 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingDataSource.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingDataSource.java @@ -41,6 +41,8 @@ public class ShardingDataSource extends AbstractDataSourceAdapter { private final ShardingProperties shardingProperties; + private final ExecutorEngine executorEngine; + private final ShardingContext shardingContext; public ShardingDataSource(final ShardingRule shardingRule) { @@ -51,8 +53,9 @@ public ShardingDataSource(final ShardingRule shardingRule, final Properties prop Preconditions.checkNotNull(shardingRule); Preconditions.checkNotNull(props); shardingProperties = new ShardingProperties(props); + executorEngine = new ExecutorEngine(shardingProperties); try { - shardingContext = new ShardingContext(shardingRule, new SQLRouteEngine(shardingRule, DatabaseType.valueFrom(getDatabaseProductName(shardingRule))), new ExecutorEngine(shardingProperties)); + shardingContext = new ShardingContext(shardingRule, new SQLRouteEngine(shardingRule, DatabaseType.valueFrom(getDatabaseProductName(shardingRule))), executorEngine); } catch (final SQLException ex) { throw new ShardingJdbcException(ex); } @@ -80,4 +83,11 @@ public ShardingConnection getConnection() throws SQLException { MetricsContext.init(shardingProperties); return new ShardingConnection(shardingContext); } + + /** + * 关闭数据源,释放相关资源. + */ + public void shutdown() { + executorEngine.shutdown(); + } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/db/AbstractShardingDataBasesOnlyDBUnitTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/db/AbstractShardingDataBasesOnlyDBUnitTest.java index b5f0197351f55..da52c34eaab41 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/db/AbstractShardingDataBasesOnlyDBUnitTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/db/AbstractShardingDataBasesOnlyDBUnitTest.java @@ -27,6 +27,7 @@ import com.dangdang.ddframe.rdb.sharding.api.strategy.table.NoneTableShardingAlgorithm; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; +import org.junit.AfterClass; import java.util.Arrays; import java.util.Collections; @@ -34,7 +35,9 @@ public abstract class AbstractShardingDataBasesOnlyDBUnitTest extends AbstractDBUnitTest { - private final String dataSourceName = "dataSource_%s"; + private static boolean isShutdown; + + private static ShardingDataSource shardingDataSource; @Override protected List getSchemaFiles() { @@ -67,13 +70,24 @@ protected List getDataSetFiles() { } protected final ShardingDataSource getShardingDataSource() { - DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap(dataSourceName)); + if (null != shardingDataSource && !isShutdown) { + return shardingDataSource; + } + isShutdown = false; + DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap("dataSource_%s")); TableRule orderTableRule = TableRule.builder("t_order").dataSourceRule(dataSourceRule).build(); TableRule orderItemTableRule = TableRule.builder("t_order_item").dataSourceRule(dataSourceRule).build(); ShardingRule shardingRule = ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(Arrays.asList(orderTableRule, orderItemTableRule)) .bindingTableRules(Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule)))) .databaseShardingStrategy(new DatabaseShardingStrategy(Collections.singletonList("user_id"), new MultipleKeysModuloDatabaseShardingAlgorithm())) .tableShardingStrategy(new TableShardingStrategy(Collections.singletonList("order_id"), new NoneTableShardingAlgorithm())).build(); - return new ShardingDataSource(shardingRule); + shardingDataSource = new ShardingDataSource(shardingRule); + return shardingDataSource; + } + + @AfterClass + public static void clear() { + isShutdown = true; + shardingDataSource.shutdown(); } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/pstatement/DynamicShardingBothForPStatementWithDMLTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/pstatement/DynamicShardingBothForPStatementWithDMLTest.java index 3b51b2e6af432..be0b31404f7e2 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/pstatement/DynamicShardingBothForPStatementWithDMLTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/pstatement/DynamicShardingBothForPStatementWithDMLTest.java @@ -21,6 +21,7 @@ import com.dangdang.ddframe.rdb.integrate.dbtbl.dynamic.DynamicShardingBothHelper; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import org.dbunit.DatabaseUnitException; +import org.junit.AfterClass; import org.junit.Test; import java.sql.Connection; @@ -29,9 +30,20 @@ public final class DynamicShardingBothForPStatementWithDMLTest extends AbstractShardingBothForPStatementWithDMLTest { + private static ShardingDataSource shardingDataSource; + @Override protected ShardingDataSource getShardingDataSource() { - return DynamicShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + if (null != shardingDataSource) { + return shardingDataSource; + } + shardingDataSource = DynamicShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + return shardingDataSource; + } + + @AfterClass + public static void clear() { + shardingDataSource.shutdown(); } @Test(expected = IllegalStateException.class) diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/pstatement/DynamicShardingBothForPStatementWithSelectTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/pstatement/DynamicShardingBothForPStatementWithSelectTest.java index 6eefb3b1a58fa..49b730404b199 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/pstatement/DynamicShardingBothForPStatementWithSelectTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/pstatement/DynamicShardingBothForPStatementWithSelectTest.java @@ -21,15 +21,27 @@ import com.dangdang.ddframe.rdb.integrate.dbtbl.dynamic.DynamicShardingBothHelper; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import org.dbunit.DatabaseUnitException; +import org.junit.AfterClass; import org.junit.Test; import java.sql.SQLException; public final class DynamicShardingBothForPStatementWithSelectTest extends AbstractShardingBothForPStatementWithSelectTest { + private static ShardingDataSource shardingDataSource; + @Override protected ShardingDataSource getShardingDataSource() { - return DynamicShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + if (null != shardingDataSource) { + return shardingDataSource; + } + shardingDataSource = DynamicShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + return shardingDataSource; + } + + @AfterClass + public static void clear() { + shardingDataSource.shutdown(); } @Test(expected = UnsupportedOperationException.class) diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/statement/DynamicShardingBothForStatementWithAggregateTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/statement/DynamicShardingBothForStatementWithAggregateTest.java index 71f213c743ac0..3d02d53afc650 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/statement/DynamicShardingBothForStatementWithAggregateTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/statement/DynamicShardingBothForStatementWithAggregateTest.java @@ -21,6 +21,7 @@ import com.dangdang.ddframe.rdb.integrate.dbtbl.dynamic.DynamicShardingBothHelper; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import org.dbunit.DatabaseUnitException; +import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; @@ -28,11 +29,19 @@ public final class DynamicShardingBothForStatementWithAggregateTest extends AbstractShardingBothTest { - private ShardingDataSource shardingDataSource; + private static ShardingDataSource shardingDataSource; @Before - public void init() throws SQLException { - shardingDataSource = getShardingDataSource(); + public void init() { + if (null != shardingDataSource) { + return; + } + shardingDataSource = DynamicShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + } + + @AfterClass + public static void clear() { + shardingDataSource.shutdown(); } @Override diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/statement/DynamicShardingBothForStatementWithDMLTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/statement/DynamicShardingBothForStatementWithDMLTest.java index 749bd5752cdc8..0c8c0cbfd7e01 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/statement/DynamicShardingBothForStatementWithDMLTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/statement/DynamicShardingBothForStatementWithDMLTest.java @@ -21,6 +21,7 @@ import com.dangdang.ddframe.rdb.integrate.dbtbl.dynamic.DynamicShardingBothHelper; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import org.dbunit.DatabaseUnitException; +import org.junit.AfterClass; import org.junit.Test; import java.sql.Connection; @@ -29,9 +30,20 @@ public final class DynamicShardingBothForStatementWithDMLTest extends AbstractShardingBothForStatementWithDMLTest { + private static ShardingDataSource shardingDataSource; + @Override protected ShardingDataSource getShardingDataSource() { - return DynamicShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + if (null != shardingDataSource) { + return shardingDataSource; + } + shardingDataSource = DynamicShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + return shardingDataSource; + } + + @AfterClass + public static void clear() { + shardingDataSource.shutdown(); } @Test(expected = IllegalStateException.class) diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/statement/DynamicShardingBothForStatementWithSelectTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/statement/DynamicShardingBothForStatementWithSelectTest.java index e685bd8522a9e..374de180ce93c 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/statement/DynamicShardingBothForStatementWithSelectTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/dynamic/statement/DynamicShardingBothForStatementWithSelectTest.java @@ -21,15 +21,27 @@ import com.dangdang.ddframe.rdb.integrate.dbtbl.dynamic.DynamicShardingBothHelper; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import org.dbunit.DatabaseUnitException; +import org.junit.AfterClass; import org.junit.Test; import java.sql.SQLException; public final class DynamicShardingBothForStatementWithSelectTest extends AbstractShardingBothForStatementWithSelectTest { + private static ShardingDataSource shardingDataSource; + @Override protected ShardingDataSource getShardingDataSource() { - return DynamicShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + if (null != shardingDataSource) { + return shardingDataSource; + } + shardingDataSource = DynamicShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + return shardingDataSource; + } + + @AfterClass + public static void clear() { + shardingDataSource.shutdown(); } @Test(expected = UnsupportedOperationException.class) diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithAggregateTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithAggregateTest.java index 7286763b90092..b7d6e5af1b384 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithAggregateTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithAggregateTest.java @@ -20,11 +20,22 @@ import com.dangdang.ddframe.rdb.integrate.dbtbl.common.pstatement.AbstractShardingBothForPStatementWithAggregateTest; import com.dangdang.ddframe.rdb.integrate.dbtbl.statically.StaticShardingBothHelper; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; +import org.junit.AfterClass; public final class StaticShardingBothForPStatementWithAggregateTest extends AbstractShardingBothForPStatementWithAggregateTest { + private static ShardingDataSource shardingDataSource; @Override protected ShardingDataSource getShardingDataSource() { - return StaticShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + if (null != shardingDataSource) { + return shardingDataSource; + } + shardingDataSource = StaticShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + return shardingDataSource; + } + + @AfterClass + public static void clear() { + shardingDataSource.shutdown(); } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithDMLTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithDMLTest.java index 945c37e1e4e39..51afa4c2b05b5 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithDMLTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithDMLTest.java @@ -21,6 +21,7 @@ import com.dangdang.ddframe.rdb.integrate.dbtbl.statically.StaticShardingBothHelper; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import org.dbunit.DatabaseUnitException; +import org.junit.AfterClass; import org.junit.Test; import java.sql.Connection; @@ -32,9 +33,20 @@ public final class StaticShardingBothForPStatementWithDMLTest extends AbstractShardingBothForPStatementWithDMLTest { + private static ShardingDataSource shardingDataSource; + @Override protected ShardingDataSource getShardingDataSource() { - return StaticShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + if (null != shardingDataSource) { + return shardingDataSource; + } + shardingDataSource = StaticShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + return shardingDataSource; + } + + @AfterClass + public static void clear() { + shardingDataSource.shutdown(); } @Test diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithGroupByTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithGroupByTest.java index 1d3e6053cd3b2..2bea4c49ffb87 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithGroupByTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithGroupByTest.java @@ -20,11 +20,23 @@ import com.dangdang.ddframe.rdb.integrate.dbtbl.common.pstatement.AbstractShardingBothForPStatementWithGroupByTest; import com.dangdang.ddframe.rdb.integrate.dbtbl.statically.StaticShardingBothHelper; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; +import org.junit.AfterClass; public final class StaticShardingBothForPStatementWithGroupByTest extends AbstractShardingBothForPStatementWithGroupByTest { + private static ShardingDataSource shardingDataSource; + @Override protected ShardingDataSource getShardingDataSource() { - return StaticShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + if (null != shardingDataSource) { + return shardingDataSource; + } + shardingDataSource = StaticShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + return shardingDataSource; + } + + @AfterClass + public static void clear() { + shardingDataSource.shutdown(); } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithSelectTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithSelectTest.java index f78f2f522f3a9..0fe3671738313 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithSelectTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/pstatement/StaticShardingBothForPStatementWithSelectTest.java @@ -21,15 +21,27 @@ import com.dangdang.ddframe.rdb.integrate.dbtbl.statically.StaticShardingBothHelper; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import org.dbunit.DatabaseUnitException; +import org.junit.AfterClass; import org.junit.Test; import java.sql.SQLException; public final class StaticShardingBothForPStatementWithSelectTest extends AbstractShardingBothForPStatementWithSelectTest { + private static ShardingDataSource shardingDataSource; + @Override protected ShardingDataSource getShardingDataSource() { - return StaticShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + if (null != shardingDataSource) { + return shardingDataSource; + } + shardingDataSource = StaticShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + return shardingDataSource; + } + + @AfterClass + public static void clear() { + shardingDataSource.shutdown(); } @Test diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/statement/StaticShardingBothForStatementWithAggregateTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/statement/StaticShardingBothForStatementWithAggregateTest.java index 66cd067a0dcad..bfc0dec54fa3b 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/statement/StaticShardingBothForStatementWithAggregateTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/statement/StaticShardingBothForStatementWithAggregateTest.java @@ -21,6 +21,7 @@ import com.dangdang.ddframe.rdb.integrate.dbtbl.statically.StaticShardingBothHelper; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import org.dbunit.DatabaseUnitException; +import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; @@ -28,11 +29,19 @@ public final class StaticShardingBothForStatementWithAggregateTest extends AbstractShardingBothTest { - private ShardingDataSource shardingDataSource; + private static ShardingDataSource shardingDataSource; @Before - public void init() throws SQLException { - shardingDataSource = getShardingDataSource(); + public void init() { + if (null != shardingDataSource) { + return; + } + shardingDataSource = StaticShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + } + + @AfterClass + public static void clear() { + shardingDataSource.shutdown(); } @Override diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/statement/StaticShardingBothForStatementWithDMLTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/statement/StaticShardingBothForStatementWithDMLTest.java index 6e1ac091c84ea..9f224fd9e2308 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/statement/StaticShardingBothForStatementWithDMLTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/statement/StaticShardingBothForStatementWithDMLTest.java @@ -21,6 +21,7 @@ import com.dangdang.ddframe.rdb.integrate.dbtbl.statically.StaticShardingBothHelper; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import org.dbunit.DatabaseUnitException; +import org.junit.AfterClass; import org.junit.Test; import java.sql.Connection; @@ -32,9 +33,20 @@ public final class StaticShardingBothForStatementWithDMLTest extends AbstractShardingBothForStatementWithDMLTest { + private static ShardingDataSource shardingDataSource; + @Override protected ShardingDataSource getShardingDataSource() { - return StaticShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + if (null != shardingDataSource) { + return shardingDataSource; + } + shardingDataSource = StaticShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + return shardingDataSource; + } + + @AfterClass + public static void clear() { + shardingDataSource.shutdown(); } @Test diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/statement/StaticShardingBothForStatementWithSelectTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/statement/StaticShardingBothForStatementWithSelectTest.java index 3a05b7c275296..7568a61863b6d 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/statement/StaticShardingBothForStatementWithSelectTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/dbtbl/statically/statement/StaticShardingBothForStatementWithSelectTest.java @@ -21,15 +21,27 @@ import com.dangdang.ddframe.rdb.integrate.dbtbl.statically.StaticShardingBothHelper; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import org.dbunit.DatabaseUnitException; +import org.junit.AfterClass; import org.junit.Test; import java.sql.SQLException; public final class StaticShardingBothForStatementWithSelectTest extends AbstractShardingBothForStatementWithSelectTest { + private static ShardingDataSource shardingDataSource; + @Override protected ShardingDataSource getShardingDataSource() { - return StaticShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + if (null != shardingDataSource) { + return shardingDataSource; + } + shardingDataSource = StaticShardingBothHelper.getShardingDataSource(createDataSourceMap("dataSource_%s")); + return shardingDataSource; + } + + @AfterClass + public static void clear() { + shardingDataSource.shutdown(); } @Test diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/hint/AbstractShardingDataBasesOnlyHintDBUnitTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/hint/AbstractShardingDataBasesOnlyHintDBUnitTest.java index c03206c4b3570..2a22c08657893 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/hint/AbstractShardingDataBasesOnlyHintDBUnitTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/hint/AbstractShardingDataBasesOnlyHintDBUnitTest.java @@ -31,6 +31,7 @@ import com.dangdang.ddframe.rdb.sharding.parser.result.router.Condition; import com.google.common.collect.Lists; import org.dbunit.DatabaseUnitException; +import org.junit.AfterClass; import java.sql.Connection; import java.sql.SQLException; @@ -38,9 +39,11 @@ import java.util.Collections; import java.util.List; -public abstract class AbstractShardingDataBasesOnlyHintDBUnitTest extends AbstractDBUnitTest { +abstract class AbstractShardingDataBasesOnlyHintDBUnitTest extends AbstractDBUnitTest { - private final String dataSourceName = "dataSource_%s"; + private static boolean isShutdown; + + private static ShardingDataSource shardingDataSource; @Override protected List getSchemaFiles() { @@ -73,14 +76,25 @@ protected List getDataSetFiles() { } protected final ShardingDataSource getShardingDataSource() { - DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap(dataSourceName)); + if (null != shardingDataSource && !isShutdown) { + return shardingDataSource; + } + isShutdown = false; + DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap("dataSource_%s")); TableRule orderTableRule = TableRule.builder("t_order").dataSourceRule(dataSourceRule).build(); TableRule orderItemTableRule = TableRule.builder("t_order_item").dataSourceRule(dataSourceRule).build(); ShardingRule shardingRule = ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(Lists.newArrayList(orderTableRule, orderItemTableRule)) .bindingTableRules(Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule)))) .databaseShardingStrategy(new DatabaseShardingStrategy(Collections.singletonList("user_id"), new MultipleKeysModuloDatabaseShardingAlgorithm())) .tableShardingStrategy(new TableShardingStrategy(Collections.singletonList("order_id"), new NoneTableShardingAlgorithm())).build(); - return new ShardingDataSource(shardingRule); + shardingDataSource = new ShardingDataSource(shardingRule); + return shardingDataSource; + } + + @AfterClass + public static void clear() { + isShutdown = true; + shardingDataSource.shutdown(); } protected void assertDataSet(final String expectedDataSetFile, final DynamicShardingValueHelper helper, @@ -97,7 +111,7 @@ protected void assertDataSet(final String expectedDataSetFile, final DynamicShar } } - protected class DynamicShardingValueHelper implements AutoCloseable { + class DynamicShardingValueHelper implements AutoCloseable { private final HintManager hintManager; diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/masterslave/AbstractShardingMasterSlaveDBUnitTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/masterslave/AbstractShardingMasterSlaveDBUnitTest.java index fe36455a63040..f3afd885270d1 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/masterslave/AbstractShardingMasterSlaveDBUnitTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/masterslave/AbstractShardingMasterSlaveDBUnitTest.java @@ -30,6 +30,7 @@ import com.dangdang.ddframe.rdb.sharding.jdbc.MasterSlaveDataSource; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; import org.junit.After; +import org.junit.AfterClass; import org.junit.Before; import javax.sql.DataSource; @@ -41,7 +42,9 @@ public abstract class AbstractShardingMasterSlaveDBUnitTest extends AbstractDBUnitTest { - private final String dataSourceName = "dataSource_%s"; + private static boolean isShutdown; + + private static ShardingDataSource shardingDataSource; @Before @After @@ -101,7 +104,11 @@ protected List getDataSetFiles() { } protected final ShardingDataSource getShardingDataSource() { - Map masterSlaveDataSourceMap = createDataSourceMap(dataSourceName); + if (null != shardingDataSource && !isShutdown) { + return shardingDataSource; + } + isShutdown = false; + Map masterSlaveDataSourceMap = createDataSourceMap("dataSource_%s"); MasterSlaveDataSource masterSlaveDs0 = new MasterSlaveDataSource("ms_0", masterSlaveDataSourceMap.get("dataSource_master_0"), Collections.singletonList(masterSlaveDataSourceMap.get("dataSource_slave_0"))); MasterSlaveDataSource masterSlaveDs1 = new MasterSlaveDataSource("ms_1", masterSlaveDataSourceMap.get("dataSource_master_1"), @@ -161,6 +168,14 @@ protected final ShardingDataSource getShardingDataSource() { .bindingTableRules(Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule)))) .databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new SingleKeyModuloDatabaseShardingAlgorithm())) .tableShardingStrategy(new TableShardingStrategy("order_id", new SingleKeyModuloTableShardingAlgorithm())).build(); - return new ShardingDataSource(shardingRule); + shardingDataSource = new ShardingDataSource(shardingRule); + return shardingDataSource; + } + + + @AfterClass + public static void clear() { + isShutdown = true; + shardingDataSource.shutdown(); } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/nullable/AbstractShardingNullableDBUnitTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/nullable/AbstractShardingNullableDBUnitTest.java index 4fd5cf3dc1713..55e3175a038e4 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/nullable/AbstractShardingNullableDBUnitTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/nullable/AbstractShardingNullableDBUnitTest.java @@ -27,14 +27,17 @@ import com.dangdang.ddframe.rdb.sharding.api.strategy.table.NoneTableShardingAlgorithm; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; +import org.junit.AfterClass; import java.util.Arrays; import java.util.Collections; import java.util.List; -public abstract class AbstractShardingNullableDBUnitTest extends AbstractDBUnitTest { +abstract class AbstractShardingNullableDBUnitTest extends AbstractDBUnitTest { - private final String dataSourceName = "dataSource_%s"; + private static boolean isShutdown; + + private static ShardingDataSource shardingDataSource; @Override protected List getSchemaFiles() { @@ -67,13 +70,25 @@ protected List getDataSetFiles() { } protected final ShardingDataSource getShardingDataSource() { - DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap(dataSourceName)); + if (null != shardingDataSource && !isShutdown) { + return shardingDataSource; + } + isShutdown = false; + DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap("dataSource_%s")); TableRule orderTableRule = TableRule.builder("t_order").dataSourceRule(dataSourceRule).build(); ShardingRule shardingRule = ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(Collections.singletonList(orderTableRule)) .bindingTableRules(Collections.singletonList(new BindingTableRule(Collections.singletonList(orderTableRule)))) .databaseShardingStrategy(new DatabaseShardingStrategy(Collections.singletonList("user_id"), new MultipleKeysModuloDatabaseShardingAlgorithm())) .tableShardingStrategy(new TableShardingStrategy(Collections.singletonList("order_id"), new NoneTableShardingAlgorithm())).build(); - return new ShardingDataSource(shardingRule); + shardingDataSource = new ShardingDataSource(shardingRule); + return shardingDataSource; + } + + + @AfterClass + public static void clear() { + isShutdown = true; + shardingDataSource.shutdown(); } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/tbl/AbstractShardingTablesOnlyDBUnitTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/tbl/AbstractShardingTablesOnlyDBUnitTest.java index 832a1d2a15a99..1b5a3a507bff5 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/tbl/AbstractShardingTablesOnlyDBUnitTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/integrate/tbl/AbstractShardingTablesOnlyDBUnitTest.java @@ -27,6 +27,7 @@ import com.dangdang.ddframe.rdb.sharding.api.strategy.database.NoneDatabaseShardingAlgorithm; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy; import com.dangdang.ddframe.rdb.sharding.jdbc.ShardingDataSource; +import org.junit.AfterClass; import java.util.Arrays; import java.util.Collections; @@ -34,7 +35,9 @@ public abstract class AbstractShardingTablesOnlyDBUnitTest extends AbstractDBUnitTest { - private final String dataSourceName = "dataSource_%s"; + private static boolean isShutdown; + + private static ShardingDataSource shardingDataSource; @Override protected List getSchemaFiles() { @@ -47,7 +50,11 @@ protected List getDataSetFiles() { } protected final ShardingDataSource getShardingDataSource() { - DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap(dataSourceName)); + if (null != shardingDataSource && !isShutdown) { + return shardingDataSource; + } + isShutdown = false; + DataSourceRule dataSourceRule = new DataSourceRule(createDataSourceMap("dataSource_%s")); TableRule orderTableRule = TableRule.builder("t_order").actualTables(Arrays.asList( "t_order_0", "t_order_1", @@ -76,6 +83,14 @@ protected final ShardingDataSource getShardingDataSource() { .bindingTableRules(Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule)))) .databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new NoneDatabaseShardingAlgorithm())) .tableShardingStrategy(new TableShardingStrategy("order_id", new SingleKeyModuloTableShardingAlgorithm())).build(); - return new ShardingDataSource(shardingRule); + shardingDataSource = new ShardingDataSource(shardingRule); + return shardingDataSource; + } + + + @AfterClass + public static void clear() { + isShutdown = true; + shardingDataSource.shutdown(); } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/executor/PreparedStatementExecutorTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/executor/PreparedStatementExecutorTest.java index a90c8fdbc092c..6f46fe35eab5e 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/executor/PreparedStatementExecutorTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/executor/PreparedStatementExecutorTest.java @@ -72,8 +72,10 @@ public void tearDown() throws NoSuchFieldException, IllegalAccessException { ExecutorTestUtil.clear(); DMLExecutionEventBus.clearListener(); DQLExecutionEventBus.clearListener(); + executorEngine.shutdown(); } + @SuppressWarnings("unchecked") @Test public void assertNoStatement() throws SQLException { PreparedStatementExecutor actual = new PreparedStatementExecutor(executorEngine, Collections.EMPTY_LIST); diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/executor/StatementExecutorTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/executor/StatementExecutorTest.java index 8e3c9518d3716..0890fa710e599 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/executor/StatementExecutorTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/executor/StatementExecutorTest.java @@ -76,6 +76,7 @@ public void tearDown() throws NoSuchFieldException, IllegalAccessException { ExecutorTestUtil.clear(); DMLExecutionEventBus.clearListener(); DQLExecutionEventBus.clearListener(); + executorEngine.shutdown(); } @Test diff --git a/sharding-jdbc-doc/content/post/release_notes.md b/sharding-jdbc-doc/content/post/release_notes.md index dba6554d8647e..5b45de4a659ce 100644 --- a/sharding-jdbc-doc/content/post/release_notes.md +++ b/sharding-jdbc-doc/content/post/release_notes.md @@ -1,3 +1,4 @@ + +++ date = "2016-02-05T17:03:18+08:00" title = "Release Notes" @@ -18,6 +19,8 @@ weight = 1 1. [ISSUE #114](https://github.com/dangdangdotcom/sharding-jdbc/issues/114) ShardingPreparedStatement执行批处理任务时,反复解析sql导致oom 1. [ISSUE #33](https://github.com/dangdangdotcom/sharding-jdbc/issues/33) Limit支持问题 1. [ISSUE #124](https://github.com/dangdangdotcom/sharding-jdbc/issues/124) com.dangdang.ddframe.rdb.sharding.jdbc.adapter.AbstractStatementAdapter.getUpdateCount返回值不符合JDBC规范 +1. [ISSUE #141](https://github.com/dangdangdotcom/sharding-jdbc/issues/141) 多线程执行器参数设置失效 + ## 1.3.1