jdbc加载多个不同版本驱动jar包

2023-11-06

项目需要连接不同版本的数据库,大多数情况下,最新版本的驱动包会兼容老版本的数据库,但仍存在新版的驱动连接老版本数据库出现不兼容的情况。
需要在同一个运行环境中同时加载多个不同版本的驱动对象。

先上代码

public void driverTest() throws Exception {
        String userName = "username";
        String password = "password";
        String url = "jdbc:mysql://localhost:3306/schema";
        String className = "com.mysql.jdbc.Driver";
        String jarFilePath = "jar:file:/home/xxx/libs/mysql-connector-java-8.0.29.jar!/";
		
        URLClassLoader loader = new URLClassLoader(new URL[]{new URL(jarFilePath)}, null);
        Driver driver = (Driver) Class.forName(className, true, loader).newInstance();
        Connection connection = null;

        Properties info = new Properties();
        info.put("user", userName);
        info.put("password", password);
        connection = driver.connect(url, info);

        System.out.println(connection.getMetaData().getDatabaseProductVersion());
        System.out.println(connection.getMetaData().getDriverVersion());
    }

1. 类加载器

URLClassLoader loader = new URLClassLoader(new URL[]{new URL(jarFilePath)}, null);

jarFilePath指向类所在的jar包,指定类加载器装载驱动类的路径。
注意类加载器的parent需要设为null,否则它会将加载类通过双亲委派机制委派给AppClassLoader,如果AppClassLoader中已经存在同限定名的类(比如pom文件依赖),这里UrlClassLoader中加载的类会被忽略。
jar包路径需要添加前缀"jar:file:“与后缀”!/",不然会报错(mysql场景)。在连接其他数据库时,前缀与后缀需要按情况调整。

2.获取驱动与连接

Driver driver = (Driver) Class.forName(className, true, loader).newInstance();
...
 connection = driver.connect(url, info);

Class.forName用于加载指定限定名的类,参数中需要指定类加载器loader。jdbc的驱动类被加载时,会被驱动管理器DriverManager管理,但是通过DriverManager.getConnection()方法获取连接时,无法指定类加载器/驱动对象,这里需要使用driver.connect()。

3. 线程池

    public void druidTest() throws Exception {
        String userName = "user";
        String password = "password";
        String url = "jdbc:mysql://localhost:3306/schema";
        String className = "com.mysql.cj.jdbc.Driver";
        String jarFilePath = "jar:file:/home/xxx/libs/mysql-connector-java-8.0.29.jar!/";

        URLClassLoader loader = new URLClassLoader(new URL[]{new URL(jarFilePath)}, null);

        DruidDataSource source = DruidDataSourceBuilder.create().build();
        source.setUsername(userName);
        source.setPassword(password);
        source.setUrl(url);
        source.setDriverClassName(className);
        source.setDriverClassLoader(loader);
        source.setInitialSize(10);
        source.setMaxActive(10);
        source.setMinIdle(3);

        System.out.println(source.getConnection());
        System.out.println(source.getConnection());
        System.out.println(source.getConnection());
        System.exit(0);

        Connection connection = source.getConnection();

       System.out.println(connection.getMetaData().getDatabaseProductVersion());
        System.out.println(connection.getMetaData().getDriverVersion());
    }

线程池用到的是阿里的druid。
hikari无法指定类加载器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jdbc加载多个不同版本驱动jar包 的相关文章

  • 猪的组连接等效吗?

    试图在 Pig 上完成这个任务 寻找 MySQL 的 group concat 等效项 例如 在我的表中 我有以下内容 3fields userid clickcount pagenumber 155 2 12 155 3 133 155
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • MySQL - 多个结果集

    我正在使用 NET Connector 连接到 MySQL 在我的应用程序中 很少有线程使用相同的连接 因此如果 MySQLDataReader 尚未关闭并且某个线程正在尝试执行查询 则会出现该错误 已经有一个打开的 DataReader
  • 如何在 Eclipse 中使用其他外部 jar 依赖项创建不可运行/不可执行的 jar

    我无法通过 Eclipse 导出向导创建普通的 jar 不可运行 不可执行 它仅创建 jar 文件 但不会导出依赖的 jar 从而在从其他类调用导出的 jar 的方法时出现错误 请帮助 非常感谢 kurellajunior的建议 它是通过使
  • MySQL 将表从 Latin1 转换为 utf8

    我需要将包含大量数据的表从 Latin1 转换为 utf8 以便它可以接受韩语字符 如何更改该表而不损坏其中的数据 我的 SQL 语句是什么 最好的方法是什么 ALTER TABLE database name table name CON
  • 更改mysql数据库表中的日期格式

    大家早上好 只是一个简单的问题 在我现有的 MySql 数据库中 我几乎没有包含日期 的列 目前这些是年 月 日格式 但现在我需要将其全部更改为年 月 日格式 我试过了select date format curdate d m Y 但它不
  • 从 call_log 中获取最大并发通话数

    我需要帮助在 MySQL 5 0 77 中编写一个查询 根据下面所示的数据 办公室一天的通话量 返回并发电话呼叫的峰值数量 我只是想知道一天中任何特定时间同时打电话的人数最多是多少 首先 这是 MySQL 表 CREATE TABLE ca
  • 连接到 OpenShift (Redhat Paas) mysql 实例

    我正在尝试将我的 C 应用程序与 openshift 数据库连接 但我得到了这个例外conn Open Eccezione gt MySql Data MySqlClient MySqlException 0x80004005 Unable
  • 无法在 Zend Framework 中回滚事务

    我在 Zend Framework 中使用以下代码进行事务 但回滚功能不起作用 数据通过 insertSome data 插入数据库 怎么了 db gt beginTransaction try model gt insertSome da
  • MVCC 如何与 MySql 中的 Lock 配合使用?

    我知道Mysql中使用锁或者MVCC可以实现并发控制 比如可重复读 但我不知道MVCC如何避免幻读 在其他地方了解到一般是通过MVCC和Gap Lock来实现的 但是目前我理解的是MVCC不需要锁 即更新和删除都是使用undo log来实现
  • MySQL正则表达式:如何将字符串中的数字与\d匹配?

    我有一个专栏release date它以字符串格式存储日期 不是 DATETIME 格式 因为它们有时可以是任何其他字符串文字 我想根据给定的月份和年份查找任意日期的所有记录 尝试遵循但对我不起作用 gt Post find all con
  • 如何删除 MySQL 数据库?

    你可能从我的上一个问题中注意到一个问题引发了更多的问题 在 MySQL 监视器中阅读 MySQL 手册 https stackoverflow com questions 1081399 我的数据库现在无法使用 部分原因是我想破坏东西并且无
  • MySQL“列计数与第 1 行的值计数不匹配”是什么意思

    这是我收到的消息 ER WRONG VALUE COUNT ON ROW 列计数与第 1 行的值计数不匹配 这是我的全部代码 我的错误在哪里 DROP TABLE student CREATE TABLE employee emp id I
  • MySQL:如何仅获取正值的平均值?

    假设我有 INT 列 并且我使用 1 来表示插入时没有可用数据 我想获得该列中所有 0 或更大值的平均值 这可能吗 Thanks 我忘了提及 我正在与其他 AVG 一起执行此操作 因此从选项卡中选择 avg a avg b avg d 所以
  • 使用 MYSQL 将 h:mm pm/am 时间格式插入数据库

    我正在尝试将以 h mm am pm 格式写入的时间插入到存储为标准 DATETIME 格式 hh mm ss 的数据库中 但我不知道如何将发布的时间转换为标准格式所以数据库会接受它 这是我到目前为止一直在尝试的 title POST in
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • mysql 不带空字符串和 NULL 的不同值

    如何检索没有空字符串值和NULL值的mysql不同值 SELECT DISTINCT CON EMAILADDRESS AS E MAIL FROM STUDENT INNER JOIN CONTACT CON ON STUDENT CON
  • 条件触发器的Django迁移sql

    我想创建一个触发器 仅在满足条件时插入表 我尝试过使用 IF BEGIN END 和 WHERE 的各种组合 但 Django 每次都会返回 SQL 语法错误 这里 type user id指的是触发该事件的人 user id指的是接收到通
  • 使用函数的 SQL 查询 - 如何获取列表的最大计数

    如何查询 MAXIMUM COUNT 交易次数 我的代码如下 SELECT customer id COUNT customer id FROM rental GROUP BY customer id HAVING MAX COUNT cu
  • 选择获取与 MySQL Group 中 max 对应的整行

    当我使用Max使用后查找特定 MySQL 组中字段的最大值GROUP BY 是否可以获取包含最大值的整行 我在处理一些论坛代码时偶然发现了这个线程 我想获取每个线程的最新帖子并将其显示在特定板的线程列表中 Quassnoi上面的回答对我非常

随机推荐

  • 神经网络:Epoch、Batch Size和迭代

    Epoch Batch Size和迭代 深度学习模型离不开这3个术语 下面我们来了解下它们的区别 和联系 背景知识 梯度下降 分三点 1 直观理解 2 梯度下降怎么做 3 梯度下降有啥用 1 直观理解梯度下降 其实它没啥就是让计算机不断猜最
  • Java 中正则表达式的详解

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 前言 Java提供正则表达式技术 专门用于处理文本问题 简单的说 正则表达式 regular expression 是对字符串执行模式匹
  • cpu,内存条,硬盘,显卡,主板,显示器之间的关系

    cpu不能直接处理硬盘上的数据 操作系统将硬盘上的数据传输到内存条上 cpu再处理内存条上的数据 如果是图像则通过显卡在显示器上输出 如果是声音数据则被发送到声卡 cpu 内存条 硬盘 显卡都是插在主板上的 这几个都是通过主板将其组织起来
  • ERROR in ./src/vue/login.vue?vue&type=template&id=28b333d2& 2:0 Module parse failed: Unexpected toke

    简单 https blog csdn net qq 25835645 article details 83473078 通俗易懂 清晰 https blog csdn net cominglately article details 805
  • vue富文本编辑器 组件封装

    Vue Quill Editor vue quill editor基本配置 gt npm install vue quill editor s main js中引入 import VueQuillEditor from vue quill
  • N+1查询问题

    一 概述 N 1的问题主要出现在发起关联查询时 例如 select from CUSTOMERS select from ORDERS where CUSTOMER ID 1 select from ORDERS where CUSTOME
  • 安装npm 并启动vue 项目

    1 windows查看是否安装npm Win R 输入cmd 输入npm v D wwwroot etc com gt node v 6 13 4 D wwwroot etc com gt v8 17 0 2 解决 npm ERR miss
  • POWER BI - 与其他BI工具的比较

    Power BI vs Tableau Tableau被认为是BI市场中的领先工具之一 Power BI被认为是与Tableau紧密竞争的新兴工具 因为它具有后端数据处理功能以及与数据源列表的连接 Tableau是市场上最好的数据可视化工具
  • 音视频处理基础知识扫盲:数字视频YUV像素表示法以及视频帧和编解码概念介绍

    专栏 Python基础教程目录 专栏 使用PyQt开发图形界面Python应用 专栏 PyQt moviepy音视频剪辑实战 专栏 PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一 引言 笔者本人对音视频编码处理的基本概念
  • linux网络编程(四)多路I/O转接服务器

    文章目录 1 多路I O转接服务器 2 select 方式的多路I O转接服务器 3 poll 方式的多路I O转接服务器 4 epoll 方式的多路I O转接服务器 1 多路I O转接服务器 多路IO转接服务器也叫做多任务IO服务器 该类
  • QT自定义Tab标签页,可以删除、添加、修改和选中

    先看效果 部分源码 pragma once include
  • 破解Zip加密文件常用的几种方法

    前言 在互联网的浪潮中 大家也许碰到过这种情况 从网络上下载了一个zip文件 最后却发现它是用密码保护的 或者自己用密码加密了一个很重要zip文件 但是一段时间后忘记了密码 无法打开 这个时候 我们就可能就需要对这个加密文件进行破解了 而随
  • 第六站:零基础认识JS的基础语法

    欢迎来到 JavaWeb的奇妙冒险 教学系列 在这里 我们将继续探索Web开发的精彩世界 本站将为你揭开JavaScript的神秘面纱 让我们在学习的过程中既轻松愉快 又能掌握高质量的知识 准备好进入第六站的学习之旅了吗 让我们开始吧 第六
  • Java定时任务调度工具Quartz(一)——简单介绍

    引言 最近因为疫情闹得严重 业务部门需求少了很多 我这边相对比以前轻松一丢丢 终于可以把许多年前心头大患梳理一下搞一搞了 我的心头大患是什么呢 就是这个系统的26个跑批 完全依赖JAR包 没有可视化操作页面 没有系统监控调度工具 就那么跑
  • sqli-labs Less18 原理到实现详解

    目录 前期知识储备 一 初始思路 1 思路 2 user agent后加入 发现出现sql错误日志 3 我尝试了之前用的各种闭合方法 都已失败告终 4 新的问题 5 现在想的是如何利用mysql插入语句insert实现注入 前期知识储备 从
  • 《视觉SLAM十四讲》学习笔记-第四讲部分习题的证明思路

    1 验证SO 3 SE 3 和Sim 3 关于乘法成群 证明 先看SO 3 定义为 SO 3 R R3 3 RR I det R 1 S O 3 R
  • java.lang.IllegalArgumentException: parameter must be a descendant of this view

    一 问题描述 ScrollView 里面嵌套了 RecyclerView 当RecyclerView里面的EditText获取焦点 然后更新数据 会闪退 并报如下错误 java lang IllegalArgumentException p
  • python 连接 hive

    由于版本的不同 Python 连接 hive 的方式也就不一样 在网上搜索关键字 python hive 的时候可以找到一些解决方案 大部分是这样的 首先把hive 根目录下的 HIVE HOME lib py拷贝到 python 的库中
  • dbeaver一些基本操作和设置(含有设置背景豆沙绿护眼模式)

    以前用的mysql客户端都是navicat 现在公司不让用了 今天接触到dbeaver 分享一些常用的一些知识 什么是dbeaver 它能干什么 DBeaver 是一个通用的数据库管理工具和 SQL 客户端 支持 MySQL Postgre
  • jdbc加载多个不同版本驱动jar包

    项目需要连接不同版本的数据库 大多数情况下 最新版本的驱动包会兼容老版本的数据库 但仍存在新版的驱动连接老版本数据库出现不兼容的情况 需要在同一个运行环境中同时加载多个不同版本的驱动对象 先上代码 public void driverTes