動的ロードjdbcドライバ(jdbcの異なるバージョンの互換性をテスト可能)

10174 ワード

の原因となる


新しいタスクを受信するには、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 jdbcVersionMap = new HashMap();
        private static final Map tmpDriverMap = new HashMap();
    
        //  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();
        }
    }