动态加载jdbc驱动(可测试jdbc不同版本兼容性)

来源:互联网 发布:结构优化 编辑:程序博客网 时间:2024/05/16 11:12

缘由

接到一个新任务,需要测试应用对mysql jdbc不同版本驱动的兼容性。这里希望能够以代码的形式,手动加载不同版本的mysql jdbc驱动,比如有下列的驱动版本,我要一个一个进行测试:

  • mysql-connector-java-5.1.6.jar
  • mysql-connector-java-5.1.31.jar
  • mysql-connector-java-5.1.35.jar
  • mysql-connector-java-5.1.39.jar
  • mysql-connector-java-6.0.3.jar

实现

参考stackoverflow上做法:

http://stackoverflow.com/questions/14478870/dynamically-load-the-jdbc-driver

觉得挺有意思的,写了如下代码,可以实现动态加载不同版本的jdbc驱动进行一些测试:

import java.net.URL;import java.net.URLClassLoader;import java.sql.Connection;import java.sql.Driver;import java.sql.DriverManager;import java.sql.DriverPropertyInfo;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.SQLFeatureNotSupportedException;import java.sql.Statement;import java.util.HashMap;import java.util.Map;import java.util.Properties;import java.util.logging.Logger;public class MycatMulitJdbcVersionTest {    private static final String JDBC_URL = "jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC&useSSL=false";    private static final String USER = "root";    private static final String PASSWORD = "mysql";    private static final Map<String, String> jdbcVersionMap = new HashMap<String, String>();    private static final Map<String, Driver> tmpDriverMap = new HashMap<String, Driver>();    // 动态加载jdbc驱动    private static void dynamicLoadJdbc(String mysqlJdbcFile) throws Exception {        URL u = new URL("jar:file:lib/" + mysqlJdbcFile + "!/");        String classname = jdbcVersionMap.get(mysqlJdbcFile);        URLClassLoader ucl = new URLClassLoader(new URL[] { u });        Driver d = (Driver)Class.forName(classname, true, ucl).newInstance();        DriverShim driver = new DriverShim(d);        DriverManager.registerDriver(driver);        tmpDriverMap.put(mysqlJdbcFile, driver);    }    // 每一次测试完卸载对应版本的jdbc驱动    private static void dynamicUnLoadJdbc(String mysqlJdbcFile) throws SQLException {        DriverManager.deregisterDriver(tmpDriverMap.get(mysqlJdbcFile));    }    // 进行一次测试    private static void testOneVersion(String mysqlJdbcFile) {        System.out.println("start test mysql jdbc version : " + mysqlJdbcFile);        try {            dynamicLoadJdbc(mysqlJdbcFile);        } catch (Exception e1) {            e1.printStackTrace();        }        Connection conn = null;        try {            conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);            Statement stmt = conn.createStatement();            ResultSet rs = stmt.executeQuery("select user()");            System.out.println("select user() output : ");            while(rs.next()) {                System.out.println(rs.getObject(1));            }            rs = stmt.executeQuery("show tables");            System.out.println("show tables output : ");            while(rs.next()) {                System.out.println(rs.getObject(1));            }        } catch (SQLException e) {            e.printStackTrace();        } finally {            if(conn != null) {                try {                    conn.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }        }        try {            dynamicUnLoadJdbc(mysqlJdbcFile);        } catch (SQLException e) {            e.printStackTrace();        }        System.out.println("end !!!");        System.out.println();    }    public static void main(String[] args) {        jdbcVersionMap.put("mysql-connector-java-6.0.3.jar", "com.mysql.cj.jdbc.Driver");        jdbcVersionMap.put("mysql-connector-java-5.1.6.jar", "com.mysql.jdbc.Driver");        jdbcVersionMap.put("mysql-connector-java-5.1.31.jar", "com.mysql.jdbc.Driver");        jdbcVersionMap.put("mysql-connector-java-5.1.35.jar", "com.mysql.jdbc.Driver");        jdbcVersionMap.put("mysql-connector-java-5.1.39.jar", "com.mysql.jdbc.Driver");        for(String mysqlJdbcFile : jdbcVersionMap.keySet()) {            testOneVersion(mysqlJdbcFile);        }    }}class DriverShim implements Driver {    private Driver driver;    DriverShim(Driver d) { this.driver = d; }    public boolean acceptsURL(String u) throws SQLException {        return this.driver.acceptsURL(u);    }    public Connection connect(String u, Properties p) throws SQLException {        return this.driver.connect(u, p);    }    @Override    public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException {        return this.driver.getPropertyInfo(url, info);    }    @Override    public int getMajorVersion() {        return this.driver.getMajorVersion();    }    @Override    public int getMinorVersion() {        return this.driver.getMinorVersion();    }    @Override    public boolean jdbcCompliant() {        return this.driver.jdbcCompliant();    }    @Override    public Logger getParentLogger() throws SQLFeatureNotSupportedException {        return this.driver.getParentLogger();    }}
0 0