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);
}