我在DestroyThread里面加上了心跳连接的代码,还在测试阶段:
//After the remove,we do heartbeat
if (connections.length > 1) {
for (int i = 0; i < heartBeatCount; i++) {
try {
lock.lockInterruptibly();
} catch (InterruptedException e) {
return;
}
//we get the first connection to do heartbeat with Locking
DruidConnectionHolder connection = connections[0];
if (connection == null || connection.getConnection() == null) {
LOG.info("The connection array is empty,no need hearbeat");
return;
}
//we remove it from the connection arrays with Locking
try {
System.arraycopy(connections, 1, connections, 0, poolingCount - 1);
Arrays.fill(connections, poolingCount - 1, poolingCount, null);
poolingCount -= 1;
} catch (Exception e) {
LOG.error("Remove connection from arrays,exception caught", e);
} finally {
lock.unlock();
}
//now we can do the heartBeat without lock
boolean validate = testConnectionInternal(connection.getConnection());
LOG.info("now we do heartbeat");
if (!validate) {
LOG.info("skip not validate connection.");
//if empty signal it
discardConnection(connection.getConnection());
destroyCount.incrementAndGet();
//if not valid,close it and do the next heart beat
continue;
} else {
//we can't use lockInterruptibly,beacuse the connectin may lost
lock.lock();
//if valid,put the connection back
try {
//the poolingCount can increase
if(poolingCount < maxActive){
//if notempty not signal it
putLast(connection, System.currentTimeMillis());
}else{
discardConnection(connection.getConnection());
destroyCount.incrementAndGet();
}
} catch (Exception e) {
LOG.error("heartbeat put last exception caught ", e);
} finally {
lock.unlock();
}
}
}