动态加载数据库驱动包

最近接到一个比较恶心的需求,里面有一个小功能,使用不同的数据库驱动动态连接数据库,搞了一个测试demo,废话少说直接上代码

package com.aotain.taskmgr;

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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值