|
|
|
@ -35,6 +35,7 @@ import java.util.concurrent.CountDownLatch;
|
|
|
|
|
import java.util.concurrent.ScheduledFuture; |
|
|
|
|
import java.util.concurrent.TimeUnit; |
|
|
|
|
import java.util.concurrent.atomic.AtomicLong; |
|
|
|
|
import java.util.concurrent.locks.Condition; |
|
|
|
|
import java.util.concurrent.locks.Lock; |
|
|
|
|
import java.util.concurrent.locks.ReentrantLock; |
|
|
|
|
|
|
|
|
@ -143,7 +144,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
|
|
|
|
private LogStatsThread logStatsThread; |
|
|
|
|
private int createTaskCount; |
|
|
|
|
|
|
|
|
|
private final CountDownLatch initedLatch = new CountDownLatch(2); |
|
|
|
|
private CountDownLatch initedLatch = new CountDownLatch(2); |
|
|
|
|
|
|
|
|
|
private volatile boolean enable = true; |
|
|
|
|
|
|
|
|
@ -602,6 +603,30 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
|
|
|
|
this.connectProperties = properties; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private synchronized void createThreadChange() { |
|
|
|
|
String threadName = "Druid-ConnectionPool-Create-" + System.identityHashCode(this) + this.getUrl(); |
|
|
|
|
createConnectionThread = new CreateConnectionThread(threadName); |
|
|
|
|
createConnectionThread.setStarted(false); |
|
|
|
|
String destroyName = "Druid-ConnectionPool-Destroy-" + System.identityHashCode(this) + this.getUrl(); |
|
|
|
|
destroyConnectionThread = new DestroyConnectionThread(destroyName); |
|
|
|
|
destroyConnectionThread.setStarted(false); |
|
|
|
|
initedLatch = new CountDownLatch(2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void checkThread() throws SQLException { |
|
|
|
|
if (!createConnectionThread.isStarted() && !destroyConnectionThread.isStarted()) { |
|
|
|
|
createConnectionThread.setStarted(true); |
|
|
|
|
createConnectionThread.start(); |
|
|
|
|
destroyConnectionThread.setStarted(true); |
|
|
|
|
destroyConnectionThread.start(); |
|
|
|
|
try { |
|
|
|
|
initedLatch.await(); |
|
|
|
|
} catch (InterruptedException e) { |
|
|
|
|
throw new SQLException(e.getMessage(), e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void init() throws SQLException { |
|
|
|
|
if (inited) { |
|
|
|
|
return; |
|
|
|
@ -817,7 +842,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
|
|
|
|
|
|
|
|
|
protected void createAndStartCreatorThread() { |
|
|
|
|
if (createScheduler == null) { |
|
|
|
|
String threadName = "Druid-ConnectionPool-Create-" + System.identityHashCode(this); |
|
|
|
|
String threadName = "Druid-ConnectionPool-Create-" + System.identityHashCode(this) + this.getUrl(); |
|
|
|
|
createConnectionThread = new CreateConnectionThread(threadName); |
|
|
|
|
createConnectionThread.start(); |
|
|
|
|
return; |
|
|
|
@ -1055,7 +1080,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
|
|
|
|
|
|
|
|
|
public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException { |
|
|
|
|
init(); |
|
|
|
|
|
|
|
|
|
checkThread(); |
|
|
|
|
if (filters.size() > 0) { |
|
|
|
|
FilterChainImpl filterChain = new FilterChainImpl(this); |
|
|
|
|
return filterChain.dataSource_connect(this, maxWaitMillis); |
|
|
|
@ -2043,6 +2068,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public class CreateConnectionThread extends Thread { |
|
|
|
|
private volatile boolean started = true; |
|
|
|
|
|
|
|
|
|
public CreateConnectionThread(String name) { |
|
|
|
|
super(name); |
|
|
|
@ -2126,6 +2152,8 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
|
|
|
|
} catch (InterruptedException interruptEx) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
DruidDataSource.this.createThreadChange(); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} catch (RuntimeException e) { |
|
|
|
|
LOG.error("create connection error", e); |
|
|
|
@ -2150,9 +2178,18 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
|
|
|
|
errorCount = 0; // reset errorCount
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public boolean isStarted() { |
|
|
|
|
return started; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void setStarted(boolean started) { |
|
|
|
|
this.started = started; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public class DestroyConnectionThread extends Thread { |
|
|
|
|
private volatile boolean started = true; |
|
|
|
|
|
|
|
|
|
public DestroyConnectionThread(String name) { |
|
|
|
|
super(name); |
|
|
|
@ -2186,6 +2223,13 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public boolean isStarted() { |
|
|
|
|
return started; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void setStarted(boolean started) { |
|
|
|
|
this.started = started; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public class DestroyTask implements Runnable { |
|
|
|
@ -2304,7 +2348,9 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
|
|
|
|
return removeCount; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** Instance key */ |
|
|
|
|
/** |
|
|
|
|
* Instance key |
|
|
|
|
*/ |
|
|
|
|
protected String instanceKey = null; |
|
|
|
|
|
|
|
|
|
public Reference getReference() throws NamingException { |
|
|
|
|