DruidDataSource add initVariable & initGlobalVariable support.

This commit is contained in:
wenshao
2016-12-10 21:18:36 +08:00
parent 322051b813
commit 3c1acd06b8
4 changed files with 164 additions and 14 deletions
@@ -62,11 +62,7 @@ import com.alibaba.druid.stat.JdbcSqlStat;
import com.alibaba.druid.stat.JdbcStatManager;
import com.alibaba.druid.support.logging.Log;
import com.alibaba.druid.support.logging.LogFactory;
import com.alibaba.druid.util.DruidPasswordCallback;
import com.alibaba.druid.util.Histogram;
import com.alibaba.druid.util.JdbcUtils;
import com.alibaba.druid.util.StringUtils;
import com.alibaba.druid.util.Utils;
import com.alibaba.druid.util.*;
/**
* @author wenshao [szujobs@hotmail.com]
@@ -252,6 +248,9 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
protected ScheduledExecutorService destroyScheduler;
protected ScheduledExecutorService createScheduler;
protected boolean initVariants = false;
protected boolean initGlobalVariants = false;
public DruidAbstractDataSource(boolean lockFair){
lock = new ReentrantLock(lockFair);
@@ -859,6 +858,22 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
this.userCallback = userCallback;
}
public boolean isInitVariants() {
return initVariants;
}
public void setInitVariants(boolean initVariants) {
this.initVariants = initVariants;
}
public boolean isInitGlobalVariants() {
return initGlobalVariants;
}
public void setInitGlobalVariants(boolean initGlobalVariants) {
this.initGlobalVariants = initGlobalVariants;
}
/**
* Retrieves the number of seconds the driver will wait for a <code>Statement</code> object to execute. If the limit
* is exceeded, a <code>SQLException</code> is thrown.
@@ -1477,6 +1492,14 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
long connectStartNanos = System.nanoTime();
long connectedNanos, initedNanos, validatedNanos;
Map<String, Object> variables = initVariants
? new HashMap<String, Object>()
: null;
Map<String, Object> globalVariables = initGlobalVariants
? new HashMap<String, Object>()
: null;
try {
conn = createPhysicalConnection(url, physicalConnectProperties);
connectedNanos = System.nanoTime();
@@ -1485,7 +1508,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
throw new SQLException("connect error, url " + url + ", driverClass " + this.driverClass);
}
initPhysicalConnection(conn);
initPhysicalConnection(conn, variables, globalVariables);
initedNanos = System.nanoTime();
validateConnection(conn);
@@ -1510,7 +1533,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
createTimespan += nano;
}
return new PhysicalConnectionInfo(conn, connectStartNanos, connectedNanos, initedNanos, validatedNanos);
return new PhysicalConnectionInfo(conn, connectStartNanos, connectedNanos, initedNanos, validatedNanos, variables, globalVariables);
}
protected void setCreateError(Throwable ex) {
@@ -1543,6 +1566,10 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
}
public void initPhysicalConnection(Connection conn) throws SQLException {
initPhysicalConnection(conn, null, null);
}
public void initPhysicalConnection(Connection conn, Map<String, Object> variables, Map<String, Object> globalVariables) throws SQLException {
if (conn.getAutoCommit() != defaultAutoCommit) {
conn.setAutoCommit(defaultAutoCommit);
}
@@ -1564,13 +1591,16 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
}
Collection<String> initSqls = getConnectionInitSqls();
if (initSqls.size() == 0) {
if (initSqls.size() == 0
&& variables == null
&& globalVariables == null) {
return;
}
Statement stmt = null;
try {
stmt = conn.createStatement();
for (String sql : initSqls) {
if (sql == null) {
continue;
@@ -1578,6 +1608,36 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
stmt.execute(sql);
}
if (JdbcConstants.MYSQL.equals(dbType)) {
if (variables != null) {
ResultSet rs = null;
try {
rs = stmt.executeQuery("show variables");
while (rs.next()) {
String name = rs.getString(1);
Object value = rs.getObject(2);
variables.put(name, value);
}
} finally {
JdbcUtils.close(rs);
}
}
if (globalVariables != null) {
ResultSet rs = null;
try {
rs = stmt.executeQuery("show global variables");
while (rs.next()) {
String name = rs.getString(1);
Object value = rs.getObject(2);
globalVariables.put(name, value);
}
} finally {
JdbcUtils.close(rs);
}
}
}
} finally {
JdbcUtils.close(stmt);
}
@@ -1838,18 +1898,32 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
private long connectedNanos;
private long initedNanos;
private long validatedNanos;
private Map<String, Object> vairiables;
private Map<String, Object> globalVairiables;
public PhysicalConnectionInfo(Connection connection //
, long connectStartNanos //
, long connectedNanos //
, long initedNanos //
, long validatedNanos) {
this(connection, connectStartNanos, connectedNanos, initedNanos,validatedNanos, null, null);
}
public PhysicalConnectionInfo(Connection connection //
, long connectStartNanos //
, long connectedNanos //
, long initedNanos //
, long validatedNanos) {
, long validatedNanos
, Map<String, Object> vairiables
, Map<String, Object> globalVairiables) {
this.connection = connection;
this.connectStartNanos = connectStartNanos;
this.connectedNanos = connectedNanos;
this.initedNanos = initedNanos;
this.validatedNanos = validatedNanos;
this.vairiables = vairiables;
this.globalVairiables = globalVairiables;
}
public Connection getPhysicalConnection() {
@@ -1875,5 +1949,13 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
public long getConnectNanoSpan() {
return connectedNanos - connectStartNanos;
}
public Map<String, Object> getVairiables() {
return vairiables;
}
public Map<String, Object> getGlobalVairiables() {
return globalVairiables;
}
}
}