|
|
@ -143,7 +143,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat |
|
|
|
private LogStatsThread logStatsThread; |
|
|
|
private LogStatsThread logStatsThread; |
|
|
|
private int createTaskCount; |
|
|
|
private int createTaskCount; |
|
|
|
|
|
|
|
|
|
|
|
private final CountDownLatch initedLatch = new CountDownLatch(2); |
|
|
|
private CountDownLatch initedLatch = new CountDownLatch(2); |
|
|
|
|
|
|
|
|
|
|
|
private volatile boolean enable = true; |
|
|
|
private volatile boolean enable = true; |
|
|
|
|
|
|
|
|
|
|
@ -602,6 +602,34 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat |
|
|
|
this.connectProperties = properties; |
|
|
|
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()) { |
|
|
|
|
|
|
|
synchronized (this) {//线程安全问题,加个双检锁
|
|
|
|
|
|
|
|
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 { |
|
|
|
public void init() throws SQLException { |
|
|
|
if (inited) { |
|
|
|
if (inited) { |
|
|
|
return; |
|
|
|
return; |
|
|
@ -817,7 +845,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat |
|
|
|
|
|
|
|
|
|
|
|
protected void createAndStartCreatorThread() { |
|
|
|
protected void createAndStartCreatorThread() { |
|
|
|
if (createScheduler == null) { |
|
|
|
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 = new CreateConnectionThread(threadName); |
|
|
|
createConnectionThread.start(); |
|
|
|
createConnectionThread.start(); |
|
|
|
return; |
|
|
|
return; |
|
|
@ -1055,7 +1083,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat |
|
|
|
|
|
|
|
|
|
|
|
public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException { |
|
|
|
public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException { |
|
|
|
init(); |
|
|
|
init(); |
|
|
|
|
|
|
|
checkThread(); |
|
|
|
if (filters.size() > 0) { |
|
|
|
if (filters.size() > 0) { |
|
|
|
FilterChainImpl filterChain = new FilterChainImpl(this); |
|
|
|
FilterChainImpl filterChain = new FilterChainImpl(this); |
|
|
|
return filterChain.dataSource_connect(this, maxWaitMillis); |
|
|
|
return filterChain.dataSource_connect(this, maxWaitMillis); |
|
|
@ -2043,6 +2071,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public class CreateConnectionThread extends Thread { |
|
|
|
public class CreateConnectionThread extends Thread { |
|
|
|
|
|
|
|
private volatile boolean started = true; |
|
|
|
|
|
|
|
|
|
|
|
public CreateConnectionThread(String name) { |
|
|
|
public CreateConnectionThread(String name) { |
|
|
|
super(name); |
|
|
|
super(name); |
|
|
@ -2126,6 +2155,8 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat |
|
|
|
} catch (InterruptedException interruptEx) { |
|
|
|
} catch (InterruptedException interruptEx) { |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
DruidDataSource.this.createThreadChange(); |
|
|
|
|
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (RuntimeException e) { |
|
|
|
} catch (RuntimeException e) { |
|
|
|
LOG.error("create connection error", e); |
|
|
|
LOG.error("create connection error", e); |
|
|
@ -2150,9 +2181,18 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat |
|
|
|
errorCount = 0; // reset errorCount
|
|
|
|
errorCount = 0; // reset errorCount
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public boolean isStarted() { |
|
|
|
|
|
|
|
return started; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void setStarted(boolean started) { |
|
|
|
|
|
|
|
this.started = started; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public class DestroyConnectionThread extends Thread { |
|
|
|
public class DestroyConnectionThread extends Thread { |
|
|
|
|
|
|
|
private volatile boolean started = true; |
|
|
|
|
|
|
|
|
|
|
|
public DestroyConnectionThread(String name) { |
|
|
|
public DestroyConnectionThread(String name) { |
|
|
|
super(name); |
|
|
|
super(name); |
|
|
@ -2186,6 +2226,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 { |
|
|
|
public class DestroyTask implements Runnable { |
|
|
@ -2304,7 +2351,9 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat |
|
|
|
return removeCount; |
|
|
|
return removeCount; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** Instance key */ |
|
|
|
/** |
|
|
|
|
|
|
|
* Instance key |
|
|
|
|
|
|
|
*/ |
|
|
|
protected String instanceKey = null; |
|
|
|
protected String instanceKey = null; |
|
|
|
|
|
|
|
|
|
|
|
public Reference getReference() throws NamingException { |
|
|
|
public Reference getReference() throws NamingException { |
|
|
|