mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
bug fixed for testWhileIdle.
This commit is contained in:
@@ -23,17 +23,7 @@ import java.security.PrivilegedAction;
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.ConcurrentModificationException;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.ServiceLoader;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
@@ -461,6 +451,17 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
String property = properties.getProperty("druid.initConnectionSqls");
|
||||
if (property != null && property.length() > 0) {
|
||||
try {
|
||||
StringTokenizer tokenizer = new StringTokenizer(property, ";");
|
||||
setConnectionInitSqls(Collections.list(tokenizer));
|
||||
} catch (NumberFormatException e) {
|
||||
LOG.error("illegal property 'druid.initConnectionSqls'", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isKillWhenSocketReadTimeout() {
|
||||
@@ -1175,27 +1176,39 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
return;
|
||||
}
|
||||
|
||||
String realDriverClassName = driver.getClass().getName();
|
||||
if (realDriverClassName.equals(JdbcConstants.MYSQL_DRIVER) //
|
||||
|| realDriverClassName.equals(JdbcConstants.MYSQL_DRIVER_6)) {
|
||||
this.exceptionSorter = new MySqlExceptionSorter();
|
||||
} else if (realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER)
|
||||
|| realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER2)) {
|
||||
this.exceptionSorter = new OracleExceptionSorter();
|
||||
} else if (realDriverClassName.equals("com.informix.jdbc.IfxDriver")) {
|
||||
this.exceptionSorter = new InformixExceptionSorter();
|
||||
|
||||
} else if (realDriverClassName.equals("com.sybase.jdbc2.jdbc.SybDriver")) {
|
||||
this.exceptionSorter = new SybaseExceptionSorter();
|
||||
for (Class<?> driverClass = driver.getClass();;) {
|
||||
String realDriverClassName = driverClass.getName();
|
||||
if (realDriverClassName.equals(JdbcConstants.MYSQL_DRIVER) //
|
||||
|| realDriverClassName.equals(JdbcConstants.MYSQL_DRIVER_6)) {
|
||||
this.exceptionSorter = new MySqlExceptionSorter();
|
||||
} else if (realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER)
|
||||
|| realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER2)) {
|
||||
this.exceptionSorter = new OracleExceptionSorter();
|
||||
} else if (realDriverClassName.equals("com.informix.jdbc.IfxDriver")) {
|
||||
this.exceptionSorter = new InformixExceptionSorter();
|
||||
|
||||
} else if (realDriverClassName.equals(JdbcConstants.POSTGRESQL_DRIVER)
|
||||
|| realDriverClassName.equals(JdbcConstants.ENTERPRISEDB_DRIVER)) {
|
||||
this.exceptionSorter = new PGExceptionSorter();
|
||||
} else if (realDriverClassName.equals("com.sybase.jdbc2.jdbc.SybDriver")) {
|
||||
this.exceptionSorter = new SybaseExceptionSorter();
|
||||
|
||||
} else if (realDriverClassName.equals("com.alibaba.druid.mock.MockDriver")) {
|
||||
this.exceptionSorter = new MockExceptionSorter();
|
||||
} else if (realDriverClassName.contains("DB2")) {
|
||||
this.exceptionSorter = new DB2ExceptionSorter();
|
||||
} else if (realDriverClassName.equals(JdbcConstants.POSTGRESQL_DRIVER)
|
||||
|| realDriverClassName.equals(JdbcConstants.ENTERPRISEDB_DRIVER)) {
|
||||
this.exceptionSorter = new PGExceptionSorter();
|
||||
|
||||
} else if (realDriverClassName.equals("com.alibaba.druid.mock.MockDriver")) {
|
||||
this.exceptionSorter = new MockExceptionSorter();
|
||||
} else if (realDriverClassName.contains("DB2")) {
|
||||
this.exceptionSorter = new DB2ExceptionSorter();
|
||||
|
||||
} else {
|
||||
Class<?> superClass = driverClass.getSuperclass();
|
||||
if (superClass != null && superClass != Object.class) {
|
||||
driverClass = superClass;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1244,7 +1257,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
}
|
||||
|
||||
if (testOnBorrow) {
|
||||
boolean validate = testConnectionInternal(poolableConnection.conn);
|
||||
boolean validate = testConnectionInternal(poolableConnection.holder, poolableConnection.conn);
|
||||
if (!validate) {
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug("skip not validate connection.");
|
||||
@@ -1275,25 +1288,14 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
if (idleMillis >= timeBetweenEvictionRunsMillis
|
||||
|| idleMillis < 0 // unexcepted branch
|
||||
) {
|
||||
boolean validate = testConnectionInternal(poolableConnection.conn);
|
||||
boolean validate = testConnectionInternal(poolableConnection.holder, poolableConnection.conn);
|
||||
if (!validate) {
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug("skip not validate connection.");
|
||||
}
|
||||
|
||||
discardConnection(realConnection);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (JdbcConstants.MYSQL_DRIVER.equals(driverClass)) { // unexcepted branch
|
||||
long lastPacketReceivedTimeMs = MySqlUtils.getLastPacketReceivedTimeMs(realConnection);
|
||||
long mysqlIdleMillis = currentTimeMillis - lastPacketReceivedTimeMs;
|
||||
if (lastPacketReceivedTimeMs > 0 //
|
||||
&& mysqlIdleMillis >= timeBetweenEvictionRunsMillis) {
|
||||
discardConnection(realConnection);
|
||||
LOG.warn("discard long time none received connection. millis : " + mysqlIdleMillis);
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1567,7 +1569,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
}
|
||||
|
||||
if (testOnReturn) {
|
||||
boolean validate = testConnectionInternal(physicalConnection);
|
||||
boolean validate = testConnectionInternal(holder, physicalConnection);
|
||||
if (!validate) {
|
||||
JdbcUtils.close(physicalConnection);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user