diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 6d77b0e11b..1e86d27013 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -186,6 +186,14 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat configFromPropety(System.getProperties()); } + public boolean isAsyncInit() { + return asyncInit; + } + + public void setAsyncInit(boolean asyncInit) { + this.asyncInit = asyncInit; + } + public void configFromPropety(Properties properties) { { String property = properties.getProperty("druid.name"); @@ -818,6 +826,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat SQLException connectError = null; + boolean asyncInit = this.asyncInit && createScheduler == null; if (!asyncInit) { try { // init connections @@ -2211,7 +2220,14 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat try { boolean emptyWait = true; - if (createError != null && poolingCount == 0 && !discardChanged) { + if (createError != null + && poolingCount == 0 + && !discardChanged) { + emptyWait = false; + } + + if (emptyWait + && asyncInit && createCount.get() < initialSize) { emptyWait = false; } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/AsyncInitTest.java b/src/test/java/com/alibaba/druid/bvt/pool/AsyncInitTest.java new file mode 100644 index 0000000000..5a6e78ce28 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/AsyncInitTest.java @@ -0,0 +1,33 @@ +package com.alibaba.druid.bvt.pool; + +import com.alibaba.druid.pool.DruidDataSource; +import junit.framework.TestCase; + +public class AsyncInitTest extends TestCase { + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + dataSource.setAsyncInit(true); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setInitialSize(10); + dataSource.setMaxActive(10); + } + + protected void tearDown() throws Exception { + dataSource.close(); + } + + public void test_async_init() throws Exception { + dataSource.init(); + + for (int i = 0; i < 1000; ++i) { + if (dataSource.getPoolingCount() == dataSource.getInitialSize()) { + break; + } + Thread.sleep(10); + } + assertEquals(10, dataSource.getPoolingCount()); + assertEquals(10, dataSource.getCreateCount()); + } +}