diff --git a/lib/com/microsoft/sqlserver/sqljdbc4/4.0.2206.100/sqljdbc4-4.0.2206.100.jar b/lib/com/microsoft/sqlserver/sqljdbc4/4.0.2206.100/sqljdbc4-4.0.2206.100.jar new file mode 100644 index 0000000000..d6b7f6daf4 Binary files /dev/null and b/lib/com/microsoft/sqlserver/sqljdbc4/4.0.2206.100/sqljdbc4-4.0.2206.100.jar differ diff --git a/pom.xml b/pom.xml index ff0647eab9..665c6f7bdd 100644 --- a/pom.xml +++ b/pom.xml @@ -290,6 +290,18 @@ 10.2.0.2 provided + + com.microsoft.sqlserver + sqljdbc4 + 3.0.1301.101 + test + + + com.microsoft.sqlserver + sqljdbc4 + 4.0.2206.100 + test + org.nutz diff --git a/src/main/java/com/alibaba/druid/filter/FilterManager.java b/src/main/java/com/alibaba/druid/filter/FilterManager.java index 4065a07abb..787ca7a4ac 100644 --- a/src/main/java/com/alibaba/druid/filter/FilterManager.java +++ b/src/main/java/com/alibaba/druid/filter/FilterManager.java @@ -18,7 +18,9 @@ package com.alibaba.druid.filter; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.sql.SQLException; import java.util.Enumeration; +import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; @@ -78,4 +80,68 @@ public class FilterManager { filterProperties.putAll(property); } } + + public static void loadFilter(List filters, String filterName) throws SQLException { + if (filterName.length() == 0) { + return; + } + + String filterClassNames = getFilter(filterName); + + if (filterClassNames != null) { + for (String filterClassName : filterClassNames.split(",")) { + if (existsFilter(filters, filterClassName)) { + continue; + } + + Class filterClass = JdbcUtils.loadDriverClass(filterClassName); + + if (filterClass == null) { + LOG.error("load filter error, filter not found : " + filterClassName); + continue; + } + + Filter filter; + + try { + filter = (Filter) filterClass.newInstance(); + } catch (InstantiationException e) { + throw new SQLException("load managed jdbc driver event listener error. " + filterName, e); + } catch (IllegalAccessException e) { + throw new SQLException("load managed jdbc driver event listener error. " + filterName, e); + } + + filters.add(filter); + } + + return; + } + + if (existsFilter(filters, filterName)) { + return; + } + + Class filterClass = JdbcUtils.loadDriverClass(filterName); + if (filterClass == null) { + LOG.error("load filter error, filter not found : " + filterName); + return; + } + + try { + Filter filter = (Filter) filterClass.newInstance(); + filters.add(filter); + } catch (Exception e) { + throw new SQLException("load managed jdbc driver event listener error. " + filterName, e); + } + } + + private static boolean existsFilter(List filterList, String filterClassName) { + for (Filter filter : filterList) { + String itemFilterClassName = filter.getClass().getName(); + if (itemFilterClassName.equalsIgnoreCase(filterClassName)) { + return true; + } + } + return false; + } } diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index bb02faa1d9..c2309f648f 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -49,6 +49,7 @@ import javax.sql.DataSource; import com.alibaba.druid.filter.Filter; import com.alibaba.druid.filter.FilterChainImpl; +import com.alibaba.druid.filter.FilterManager; import com.alibaba.druid.filter.stat.StatFilter; import com.alibaba.druid.pool.DruidDataSource.ActiveConnectionTraceInfo; import com.alibaba.druid.pool.vendor.NullExceptionSorter; @@ -59,7 +60,6 @@ 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.ConcurrentIdentityHashMap; -import com.alibaba.druid.util.DruidFilterUtils; import com.alibaba.druid.util.Histogram; import com.alibaba.druid.util.IOUtils; import com.alibaba.druid.util.JdbcUtils; @@ -485,7 +485,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements } public void setValidConnectionCheckerClassName(String validConnectionCheckerClass) throws Exception { - Class clazz = DruidFilterUtils.loadClass(validConnectionCheckerClass); + Class clazz = JdbcUtils.loadDriverClass(validConnectionCheckerClass); ValidConnectionChecker validConnectionChecker = null; if (clazz != null) { validConnectionChecker = (ValidConnectionChecker) clazz.newInstance(); @@ -713,7 +713,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements } public void setPasswordCallbackClassName(String passwordCallbackClassName) throws Exception { - Class clazz = DruidFilterUtils.loadClass(passwordCallbackClassName); + Class clazz = JdbcUtils.loadDriverClass(passwordCallbackClassName); if (clazz != null) { this.passwordCallback = (PasswordCallback) clazz.newInstance(); } else { @@ -1012,7 +1012,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements return; } - Class clazz = DruidFilterUtils.loadClass(exceptionSorter); + Class clazz = JdbcUtils.loadDriverClass(exceptionSorter); if (clazz == null) { LOG.error("load exceptionSorter error : " + exceptionSorter); } else { @@ -1050,7 +1050,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements String[] filterArray = filters.split("\\,"); for (String item : filterArray) { - DruidFilterUtils.loadFilter(this.filters, item); + FilterManager.loadFilter(this.filters, item); } } 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 675c1368e5..cc355fbbf5 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java @@ -12,7 +12,6 @@ import com.alibaba.druid.pool.ValidConnectionChecker; import com.alibaba.druid.proxy.jdbc.ConnectionProxy; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; -import com.alibaba.druid.util.DruidFilterUtils; import com.alibaba.druid.util.JdbcUtils; public class MySqlValidConnectionChecker implements ValidConnectionChecker, Serializable { @@ -26,7 +25,7 @@ public class MySqlValidConnectionChecker implements ValidConnectionChecker, Seri public MySqlValidConnectionChecker(){ try { - clazz = DruidFilterUtils.loadClass("com.mysql.jdbc.Connection"); + clazz = JdbcUtils.loadDriverClass("com.mysql.jdbc.Connection"); ping = clazz.getMethod("ping"); if (ping != null) { driverHasPingMethod = true; 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 604e678627..3e6fa8bb83 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/OracleValidConnectionChecker.java @@ -33,7 +33,6 @@ import com.alibaba.druid.pool.ValidConnectionChecker; import com.alibaba.druid.proxy.jdbc.ConnectionProxy; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; -import com.alibaba.druid.util.DruidFilterUtils; import com.alibaba.druid.util.JdbcUtils; public class OracleValidConnectionChecker implements ValidConnectionChecker, Serializable { @@ -48,7 +47,7 @@ public class OracleValidConnectionChecker implements ValidConnectionChecker, Ser public OracleValidConnectionChecker(){ try { - clazz = DruidFilterUtils.loadClass("oracle.jdbc.driver.OracleConnection"); + clazz = JdbcUtils.loadDriverClass("oracle.jdbc.driver.OracleConnection"); if (clazz != null) { ping = clazz.getMethod("pingDatabase", new Class[] { Integer.TYPE }); } else { diff --git a/src/main/java/com/alibaba/druid/proxy/DruidDriver.java b/src/main/java/com/alibaba/druid/proxy/DruidDriver.java index 6fd8411074..637f7205ef 100644 --- a/src/main/java/com/alibaba/druid/proxy/DruidDriver.java +++ b/src/main/java/com/alibaba/druid/proxy/DruidDriver.java @@ -34,13 +34,13 @@ import javax.management.ObjectName; import com.alibaba.druid.VERSION; import com.alibaba.druid.filter.Filter; +import com.alibaba.druid.filter.FilterManager; import com.alibaba.druid.proxy.jdbc.DataSourceProxy; import com.alibaba.druid.proxy.jdbc.DataSourceProxyConfig; import com.alibaba.druid.proxy.jdbc.DataSourceProxyImpl; 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.DruidFilterUtils; import com.alibaba.druid.util.JMXUtils; import com.alibaba.druid.util.JdbcUtils; @@ -160,7 +160,7 @@ public class DruidDriver implements Driver, DruidDriverMBean { String property = System.getProperty("druid.filters"); if (property != null && property.length() > 0) { for (String filterItem : property.split(",")) { - DruidFilterUtils.loadFilter(config.getFilters(), filterItem); + FilterManager.loadFilter(config.getFilters(), filterItem); } } } @@ -203,7 +203,7 @@ public class DruidDriver implements Driver, DruidDriverMBean { int pos = restUrl.indexOf(':', FILTERS_PREFIX.length()); String filtersText = restUrl.substring(FILTERS_PREFIX.length(), pos); for (String filterItem : filtersText.split(",")) { - DruidFilterUtils.loadFilter(config.getFilters(), filterItem); + FilterManager.loadFilter(config.getFilters(), filterItem); } restUrl = restUrl.substring(pos + 1); } @@ -235,7 +235,7 @@ public class DruidDriver implements Driver, DruidDriverMBean { } public Driver createDriver(String className) throws SQLException { - Class rawDriverClass = DruidFilterUtils.loadClass(className); + Class rawDriverClass = JdbcUtils.loadDriverClass(className); if (rawDriverClass == null) { throw new SQLException("jdbc-driver's class not found. '" + className + "'"); diff --git a/src/main/java/com/alibaba/druid/util/DruidFilterUtils.java b/src/main/java/com/alibaba/druid/util/DruidFilterUtils.java deleted file mode 100644 index 1e7fdb2595..0000000000 --- a/src/main/java/com/alibaba/druid/util/DruidFilterUtils.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.util; - -import java.sql.SQLException; -import java.util.List; - -import com.alibaba.druid.filter.Filter; -import com.alibaba.druid.filter.FilterManager; -import com.alibaba.druid.support.logging.Log; -import com.alibaba.druid.support.logging.LogFactory; - -/** - * druid loader utils - * - * @author gang.su - */ -public class DruidFilterUtils { - - private final static Log LOG = LogFactory.getLog(DruidFilterUtils.class); - - public static void loadFilter(List filters, String filterName) throws SQLException { - if (filterName.length() == 0) { - return; - } - - String filterClassNames = FilterManager.getFilter(filterName); - - if (filterClassNames != null) { - for (String filterClassName : filterClassNames.split(",")) { - if (existsFilter(filters, filterClassName)) { - continue; - } - - Class filterClass = loadClass(filterClassName); - - if (filterClass == null) { - LOG.error("load filter error, filter not found : " + filterClassName); - continue; - } - - Filter filter; - - try { - filter = (Filter) filterClass.newInstance(); - } catch (InstantiationException e) { - throw new SQLException("load managed jdbc driver event listener error. " + filterName, e); - } catch (IllegalAccessException e) { - throw new SQLException("load managed jdbc driver event listener error. " + filterName, e); - } - - filters.add(filter); - } - - return; - } - - if (existsFilter(filters, filterName)) { - return; - } - - Class filterClass = loadClass(filterName); - if (filterClass == null) { - LOG.error("load filter error, filter not found : " + filterName); - return; - } - - try { - Filter filter = (Filter) filterClass.newInstance(); - filters.add(filter); - } catch (Exception e) { - throw new SQLException("load managed jdbc driver event listener error. " + filterName, e); - } - } - - /** - * 是否存在load - * - * @param filterList - * @param filterClassName - * @return - */ - private static boolean existsFilter(List filterList, String filterClassName) { - for (Filter filter : filterList) { - String itemFilterClassName = filter.getClass().getName(); - if (itemFilterClassName.equalsIgnoreCase(filterClassName)) { - return true; - } - } - return false; - } - - public static Class loadClass(String className) { - Class clazz = null; - - if (className == null) { - return null; - } - - try { - clazz = Thread.currentThread().getContextClassLoader().loadClass(className); - } catch (ClassNotFoundException e) { - - } - - if (clazz != null) { - return clazz; - } - - try { - return Class.forName(className); - } catch (ClassNotFoundException e) { - return null; - } - } -} diff --git a/src/main/java/com/alibaba/druid/util/JdbcUtils.java b/src/main/java/com/alibaba/druid/util/JdbcUtils.java index d93131968c..e3232b29d4 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcUtils.java @@ -375,7 +375,7 @@ public final class JdbcUtils { } else if (rawUrl.startsWith("jdbc:microsoft:")) { return "com.microsoft.jdbc.sqlserver.SQLServerDriver"; } else if (rawUrl.startsWith("jdbc:sqlserver:")) { - return "com.microsoft.jdbc.sqlserver.SQLServerDriver"; + return "com.microsoft.sqlserver.jdbc.SQLServerDriver"; } else if (rawUrl.startsWith("jdbc:sybase:Tds:")) { return "com.sybase.jdbc2.jdbc.SybDriver"; } else if (rawUrl.startsWith("jdbc:jtds:")) { @@ -610,4 +610,28 @@ public final class JdbcUtils { stmt.setObject(i + 1, parameters.get(i)); } } + + public static Class loadDriverClass(String className) { + Class clazz = null; + + if (className == null) { + return null; + } + + try { + clazz = Thread.currentThread().getContextClassLoader().loadClass(className); + } catch (ClassNotFoundException e) { + + } + + if (clazz != null) { + return clazz; + } + + try { + return Class.forName(className); + } catch (ClassNotFoundException e) { + return null; + } + } } diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_JeffYin.java b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_JeffYin.java new file mode 100644 index 0000000000..233cee92a9 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_JeffYin.java @@ -0,0 +1,12 @@ +package com.alibaba.druid.bvt.bug; + +import junit.framework.TestCase; + +import com.alibaba.druid.util.JdbcUtils; + +public class Bug_for_JeffYin extends TestCase { + + public void test_0() throws Exception { + String driverClass = JdbcUtils.getDriverClassName("jdbc:sqlserver://localhost:1433;"); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/proxy/utils/DruidLoaderUtilsTest.java b/src/test/java/com/alibaba/druid/bvt/proxy/utils/DruidLoaderUtilsTest.java index e3d4b884b3..81dafda2d1 100644 --- a/src/test/java/com/alibaba/druid/bvt/proxy/utils/DruidLoaderUtilsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/proxy/utils/DruidLoaderUtilsTest.java @@ -25,7 +25,8 @@ import junit.framework.TestCase; import com.alibaba.druid.bvt.proxy.DruidDriverTest.PublicJdbcFilterAdapter; import com.alibaba.druid.filter.Filter; -import com.alibaba.druid.util.DruidFilterUtils; +import com.alibaba.druid.filter.FilterManager; +import com.alibaba.druid.util.JdbcUtils; /** * druidLoader util 测试 @@ -39,42 +40,42 @@ public class DruidLoaderUtilsTest extends TestCase { List filters = new ArrayList(); // log4j String filterItem = "log4j"; - DruidFilterUtils.loadFilter(filters, filterItem); + FilterManager.loadFilter(filters, filterItem); Filter filterConfig = filters.get(0); Assert.assertNotNull(filterConfig); Assert.assertEquals("com.alibaba.druid.filter.logging.Log4jFilter", filterConfig.getClass().getName()); // stat filterItem = "stat"; filters.clear(); - DruidFilterUtils.loadFilter(filters, filterItem); + FilterManager.loadFilter(filters, filterItem); filterConfig = filters.get(0); Assert.assertNotNull(filterConfig); Assert.assertEquals("com.alibaba.druid.filter.stat.StatFilter", filterConfig.getClass().getName()); // default filterItem = "default"; filters.clear(); - DruidFilterUtils.loadFilter(filters, filterItem); + FilterManager.loadFilter(filters, filterItem); filterConfig = filters.get(0); Assert.assertNotNull(filterConfig); Assert.assertEquals("com.alibaba.druid.filter.stat.StatFilter", filterConfig.getClass().getName()); // counter filterItem = "stat"; filters.clear(); - DruidFilterUtils.loadFilter(filters, filterItem); + FilterManager.loadFilter(filters, filterItem); filterConfig = filters.get(0); Assert.assertNotNull(filterConfig); Assert.assertEquals("com.alibaba.druid.filter.stat.StatFilter", filterConfig.getClass().getName()); // commonLogging filterItem = "commonLogging"; filters.clear(); - DruidFilterUtils.loadFilter(filters, filterItem); + FilterManager.loadFilter(filters, filterItem); filterConfig = filters.get(0); Assert.assertNotNull(filterConfig); Assert.assertEquals("com.alibaba.druid.filter.logging.CommonsLogFilter", filterConfig.getClass().getName()); // encoding filterItem = "encoding"; filters.clear(); - DruidFilterUtils.loadFilter(filters, filterItem); + FilterManager.loadFilter(filters, filterItem); filterConfig = filters.get(0); Assert.assertNotNull(filterConfig); Assert.assertEquals("com.alibaba.druid.filter.encoding.EncodingConvertFilter", @@ -82,9 +83,9 @@ public class DruidLoaderUtilsTest extends TestCase { // 判定重复 filterItem = "stat"; filters.clear(); - DruidFilterUtils.loadFilter(filters, filterItem); + FilterManager.loadFilter(filters, filterItem); filterItem = "default"; - DruidFilterUtils.loadFilter(filters, filterItem); + FilterManager.loadFilter(filters, filterItem); for (Iterator iterator = filters.iterator(); iterator.hasNext();) { Filter filter = (Filter) iterator.next(); System.out.println(filter.getClass().getName()); @@ -93,12 +94,12 @@ public class DruidLoaderUtilsTest extends TestCase { } public void twest_loadClass() throws Exception { - Assert.assertEquals(null, DruidFilterUtils.loadClass(null)); - Assert.assertEquals(null, DruidFilterUtils.loadClass("xxx")); + Assert.assertEquals(null, JdbcUtils.loadDriverClass(null)); + Assert.assertEquals(null, JdbcUtils.loadDriverClass("xxx")); Assert.assertEquals(PublicJdbcFilterAdapter.class, - DruidFilterUtils.loadClass(PublicJdbcFilterAdapter.class.getName())); - Assert.assertNull(DruidFilterUtils.loadClass(null)); - Assert.assertNull(DruidFilterUtils.loadClass("")); + JdbcUtils.loadDriverClass(PublicJdbcFilterAdapter.class.getName())); + Assert.assertNull(JdbcUtils.loadDriverClass(null)); + Assert.assertNull(JdbcUtils.loadDriverClass("")); } }