diff --git a/pom.xml b/pom.xml
index 825a97fbbe..c5a8f4a2df 100644
--- a/pom.xml
+++ b/pom.xml
@@ -229,6 +229,12 @@
0.7.1.RELEASE
test
+
+ log4j
+ log4j
+ 1.2.16
+ test
+
com.alibaba
fastjson
diff --git a/src/main/java/com/alibaba/druid/logging/Jdk14LoggingImpl.java b/src/main/java/com/alibaba/druid/logging/Jdk14LoggingImpl.java
new file mode 100644
index 0000000000..e754072efe
--- /dev/null
+++ b/src/main/java/com/alibaba/druid/logging/Jdk14LoggingImpl.java
@@ -0,0 +1,39 @@
+package com.alibaba.druid.logging;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class Jdk14LoggingImpl implements Log {
+
+ private Logger log;
+
+ public Jdk14LoggingImpl(Class> clazz){
+ log = Logger.getLogger(clazz.toString());
+ }
+
+ public boolean isDebugEnabled() {
+ return log.isLoggable(Level.FINE);
+ }
+
+ public void error(String s, Throwable e) {
+ log.log(Level.SEVERE, s, e);
+ }
+
+ public void error(String s) {
+ log.log(Level.SEVERE, s);
+ }
+
+ public void debug(String s) {
+ log.log(Level.FINE, s);
+ }
+
+ public void warn(String s) {
+ log.log(Level.WARNING, s);
+ }
+
+ @Override
+ public void warn(String s, Throwable e) {
+ log.log(Level.WARNING, s, e);
+ }
+
+}
diff --git a/src/main/java/com/alibaba/druid/logging/Log4jImpl.java b/src/main/java/com/alibaba/druid/logging/Log4jImpl.java
new file mode 100644
index 0000000000..98d91c22da
--- /dev/null
+++ b/src/main/java/com/alibaba/druid/logging/Log4jImpl.java
@@ -0,0 +1,37 @@
+package com.alibaba.druid.logging;
+
+import org.apache.log4j.Logger;
+
+public class Log4jImpl implements Log {
+
+ private Logger log;
+
+ public Log4jImpl(Class> clazz){
+ log = Logger.getLogger(clazz);
+ }
+
+ public boolean isDebugEnabled() {
+ return log.isDebugEnabled();
+ }
+
+ public void error(String s, Throwable e) {
+ log.error(s, e);
+ }
+
+ public void error(String s) {
+ log.error(s);
+ }
+
+ public void debug(String s) {
+ log.debug(s);
+ }
+
+ public void warn(String s) {
+ log.warn(s);
+ }
+
+ public void warn(String s, Throwable e) {
+ log.warn(s, e);
+ }
+
+}
diff --git a/src/main/java/com/alibaba/druid/logging/LogFactory.java b/src/main/java/com/alibaba/druid/logging/LogFactory.java
index a16c7c024d..7aba90e10f 100644
--- a/src/main/java/com/alibaba/druid/logging/LogFactory.java
+++ b/src/main/java/com/alibaba/druid/logging/LogFactory.java
@@ -10,9 +10,9 @@ public class LogFactory {
static {
tryImplementation("org.apache.commons.logging.LogFactory",
"com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl");
- tryImplementation("org.apache.log4j.Logger", "com.ibatis.common.logging.log4j.Log4jImpl");
- tryImplementation("java.util.logging.Logger", "com.ibatis.common.logging.jdk14.Jdk14LoggingImpl");
- tryImplementation("java.lang.Object", "com.ibatis.common.logging.nologging.NoLoggingImpl");
+ tryImplementation("org.apache.log4j.Logger", "com.alibaba.druid.logging.Log4jImpl");
+ tryImplementation("java.util.logging.Logger", "com.alibaba.druid.logging.Jdk14LoggingImpl");
+ tryImplementation("java.lang.Object", "com.alibaba.druid.logging.NoLoggingImpl");
}
@SuppressWarnings("unchecked")
diff --git a/src/main/java/com/alibaba/druid/logging/NoLoggingImpl.java b/src/main/java/com/alibaba/druid/logging/NoLoggingImpl.java
new file mode 100644
index 0000000000..1242a7393d
--- /dev/null
+++ b/src/main/java/com/alibaba/druid/logging/NoLoggingImpl.java
@@ -0,0 +1,29 @@
+package com.alibaba.druid.logging;
+
+public class NoLoggingImpl implements Log {
+
+ public NoLoggingImpl(Class> clazz){
+ }
+
+ public boolean isDebugEnabled() {
+ return false;
+ }
+
+ public void error(String s, Throwable e) {
+ }
+
+ public void error(String s) {
+ }
+
+ public void debug(String s) {
+ }
+
+ public void warn(String s) {
+ }
+
+ @Override
+ public void warn(String s, Throwable e) {
+
+ }
+
+}
diff --git a/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java
index 77850c80bd..3bbda732ea 100644
--- a/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java
+++ b/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java
@@ -17,17 +17,17 @@ public class MySqlValidConnectionChecker implements ValidConnectionChecker, Seri
private static final long serialVersionUID = 1L;
private static final Log LOG = LogFactory.getLog(MySqlValidConnectionChecker.class);
+ private Class> clazz;
private Method ping;
private boolean driverHasPingMethod = false;
// The timeout (apparently the timeout is ignored?)
private static Object[] params = new Object[] {};
- @SuppressWarnings({ "unchecked", "rawtypes" })
public MySqlValidConnectionChecker(){
try {
- Class mysqlConnection = Thread.currentThread().getContextClassLoader().loadClass("com.mysql.jdbc.Connection");
- ping = mysqlConnection.getMethod("ping", new Class[] {});
+ clazz = Thread.currentThread().getContextClassLoader().loadClass("com.mysql.jdbc.Connection");
+ ping = clazz.getMethod("ping", new Class[] {});
if (ping != null) {
driverHasPingMethod = true;
}
@@ -37,6 +37,16 @@ public class MySqlValidConnectionChecker implements ValidConnectionChecker, Seri
}
public boolean isValidConnection(Connection c) {
+ try {
+ Connection conn = (Connection) c.unwrap(clazz);
+ if (conn != null) {
+ c = conn;
+ }
+ } catch (SQLException e) {
+ LOG.warn("Unexpected error in ping", e);
+ return false;
+ }
+
// if there is a ping method then use it, otherwise just use a 'SELECT 1' statement
if (driverHasPingMethod) {
try {
diff --git a/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java
index f763bb2e31..c5fb39b154 100644
--- a/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java
+++ b/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java
@@ -35,16 +35,16 @@ public class OracleValidConnectionChecker implements ValidConnectionChecker, Ser
private static final Log LOG = LogFactory.getLog(OracleValidConnectionChecker.class);
+ private Class> clazz;
private Method ping;
// The timeout (apparently the timeout is ignored?)
private static Object[] params = new Object[] { new Integer(5000) };
- @SuppressWarnings({ "unchecked", "rawtypes" })
public OracleValidConnectionChecker(){
try {
- Class oracleConnection = Thread.currentThread().getContextClassLoader().loadClass("oracle.jdbc.driver.OracleConnection");
- ping = oracleConnection.getMethod("pingDatabase", new Class[] { Integer.TYPE });
+ clazz = Thread.currentThread().getContextClassLoader().loadClass("oracle.jdbc.driver.OracleConnection");
+ ping = clazz.getMethod("pingDatabase", new Class[] { Integer.TYPE });
} catch (Exception e) {
throw new RuntimeException("Unable to resolve pingDatabase method:", e);
}
@@ -52,6 +52,11 @@ public class OracleValidConnectionChecker implements ValidConnectionChecker, Ser
public boolean isValidConnection(Connection c) {
try {
+ Connection conn = (Connection) c.unwrap(clazz);
+ if (conn != null) {
+ c = conn;
+ }
+
Integer status = (Integer) ping.invoke(c, params);
// Error
diff --git a/src/test/java/com/alibaba/druid/pool/MySqlValdConnectionTest.java b/src/test/java/com/alibaba/druid/pool/MySqlValdConnectionTest.java
new file mode 100644
index 0000000000..bf101ebfa0
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/pool/MySqlValdConnectionTest.java
@@ -0,0 +1,30 @@
+package com.alibaba.druid.pool;
+
+import java.sql.Connection;
+
+import junit.framework.TestCase;
+
+public class MySqlValdConnectionTest extends TestCase {
+ private String jdbcUrl;
+ private String user;
+ private String password;
+ private String driverClass;
+
+ public void setUp () throws Exception {
+ jdbcUrl = "jdbc:mysql://10.20.129.146/dragoon_v25masterdb?useUnicode=true&characterEncoding=UTF-8";
+ user = "dragoon25";
+ password = "dragoon25";
+ driverClass = "com.mysql.jdbc.Driver";
+ }
+ public void test_0 () throws Exception {
+ DruidDataSource dataSource = new DruidDataSource();
+ dataSource.setDriverClassName(driverClass);
+ dataSource.setUrl(jdbcUrl);
+ dataSource.setUsername(user);
+ dataSource.setPassword(password);
+ dataSource.setFilters("stat");
+
+ Connection conn = dataSource.getConnection();
+ conn.close();
+ }
+}