HikariCP如何加载驱动的

如果未设置driveClassName,则采用默认策略

即从DriverManager.getDriver()方法获取驱动,默认方法采用spi方法实现,jar中META-INF/services中加载以父类名命名的文件中的所有实现类

如果设置driveClassName,则采用加载方式

加载顺序为:

  • 已通过DriverManager注册过的driver
  • Thread.currentThread().getContextClassLoader()类加载器加载
  • 采用默认类加载器加载即和HikariCP的jar同样的类加载器加载

动态加载方案

我们可以看到需要动态加载,可以在加载驱动前改变当前线程的contextClassLoader实现,驱动加载完成后,将旧的contextClassLoader设置回去,防止其他代码使用错误的contextClassLoader

具体代码

//拿到旧的contextClassLoader
ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
//设置加载驱动类的classLoader
URLClassLoader urlClassLoader = URLClassLoader.newInstance(new URL[]{new URL("jdbc驱动jar包路径")}, oldContextClassLoader);
//设置加载驱动类的classLoader到当前线程的contextClassLoader
Thread.currentThread().setContextClassLoader(urlClassLoader);
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc路径");
ds.setUsername("用户名");
ds.setPassword("密码");
ds.setDriverClassName("驱动类的名称");
//省略设置其他属性代码
//......
try (Connection conn = ds.getConnection()) {
    //省略具体的执行逻辑代码  
} catch (Exception ex) {
    ex.printStackTrace();
} finally {
    //将旧的contextClassLoader设置回来
    Thread.currentThread().setContextClassLoader(oldContextClassLoader);
}