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(); + } +}