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