From 38ec095e705c69bfcb0d1f96fb39b9e89266f046 Mon Sep 17 00:00:00 2001 From: zhaohuihua Date: Fri, 21 Feb 2020 00:02:55 +0800 Subject: [PATCH 1/2] Resolve the DB2 driver from JDBC URL --- .../com/alibaba/druid/util/JdbcConstants.java | 4 +++- .../java/com/alibaba/druid/util/JdbcUtils.java | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/alibaba/druid/util/JdbcConstants.java b/src/main/java/com/alibaba/druid/util/JdbcConstants.java index 8b7757b334..7a00a4edfc 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcConstants.java +++ b/src/main/java/com/alibaba/druid/util/JdbcConstants.java @@ -25,7 +25,9 @@ public interface JdbcConstants { String DB2 = "db2"; - String DB2_DRIVER = "com.ibm.db2.jcc.DB2Driver"; + String DB2_DRIVER = "com.ibm.db2.jcc.DB2Driver"; // Type4 + String DB2_DRIVER2 = "COM.ibm.db2.jdbc.app.DB2Driver"; // Type2 + String DB2_DRIVER3 = "COM.ibm.db2.jdbc.net.DB2Driver"; // Type3 String POSTGRESQL = "postgresql"; String POSTGRESQL_DRIVER = "org.postgresql.Driver"; diff --git a/src/main/java/com/alibaba/druid/util/JdbcUtils.java b/src/main/java/com/alibaba/druid/util/JdbcUtils.java index bc8b70666b..3f7f89c69d 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcUtils.java @@ -436,7 +436,21 @@ public final class JdbcUtils implements JdbcConstants { } else if (rawUrl.startsWith("jdbc:hsqldb:")) { return "org.hsqldb.jdbcDriver"; } else if (rawUrl.startsWith("jdbc:db2:")) { - return DB2_DRIVER; + // Resolve the DB2 driver from JDBC URL + // Type2 COM.ibm.db2.jdbc.app.DB2Driver, url = jdbc:db2:databasename + // Type3 COM.ibm.db2.jdbc.net.DB2Driver, url = jdbc:db2:ServerIP:6789:databasename + // Type4 8.1+ com.ibm.db2.jcc.DB2Driver, url = jdbc:db2://ServerIP:50000/databasename + String prefix = "jdbc:db2:"; + if (rawUrl.startsWith(prefix + "//")) { // Type4 + return DB2_DRIVER; // "com.ibm.db2.jcc.DB2Driver"; + } else { + String suffix = rawUrl.substring(prefix.length()); + if (suffix.indexOf(':') > 0) { // Type3 + return DB2_DRIVER3; // COM.ibm.db2.jdbc.net.DB2Driver + } else { // Type2 + return DB2_DRIVER2; // COM.ibm.db2.jdbc.app.DB2Driver + } + } } else if (rawUrl.startsWith("jdbc:sqlite:")) { return SQLITE_DRIVER; } else if (rawUrl.startsWith("jdbc:ingres:")) { From 82901a96adc6178e70c8a922368206c79e359afb Mon Sep 17 00:00:00 2001 From: zhaohuihua Date: Fri, 21 Feb 2020 00:08:58 +0800 Subject: [PATCH 2/2] extract method: resolveDriver --- .../alibaba/druid/pool/DruidDataSource.java | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index c2116ad0a7..8b02515410 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -883,24 +883,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat initFromSPIServiceLoader(); - if (this.driver == null) { - if (this.driverClass == null || this.driverClass.isEmpty()) { - this.driverClass = JdbcUtils.getDriverClassName(this.jdbcUrl); - } - - if (MockDriver.class.getName().equals(driverClass)) { - driver = MockDriver.instance; - } else { - if (jdbcUrl == null && (driverClass == null || driverClass.length() == 0)) { - throw new SQLException("url not set"); - } - driver = JdbcUtils.createDriver(driverClassLoader, driverClass); - } - } else { - if (this.driverClass == null) { - this.driverClass = driver.getClass().getName(); - } - } + resolveDriver(); initCheck(); @@ -1213,6 +1196,27 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat LOG.error(errorMessage + "validationQuery not set"); } + protected void resolveDriver() throws SQLException { + if (this.driver == null) { + if (this.driverClass == null || this.driverClass.isEmpty()) { + this.driverClass = JdbcUtils.getDriverClassName(this.jdbcUrl); + } + + if (MockDriver.class.getName().equals(driverClass)) { + driver = MockDriver.instance; + } else { + if (jdbcUrl == null && (driverClass == null || driverClass.length() == 0)) { + throw new SQLException("url not set"); + } + driver = JdbcUtils.createDriver(driverClassLoader, driverClass); + } + } else { + if (this.driverClass == null) { + this.driverClass = driver.getClass().getName(); + } + } + } + protected void initCheck() throws SQLException { if (JdbcUtils.ORACLE.equals(this.dbType)) { isOracle = true;