ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

IDEA数据库驱动下载慢?手动配置JDBC驱动文件三步搞定

IDEA数据库驱动下载慢?手动配置JDBC驱动文件三步搞定

如果你在 IDEA 里新建数据库连接,点完 “Test Connection” 之后,界面左下角一直挂着 “Downloading driver files”,进度条半天不动,那你大概率已经撞上本文要聊的话题:IDEA 下载数据库驱动太慢了。我第一次遇到这种情况时以为是电脑卡了,打开任务管理器才发现 IDEA 正在后台拉取 JDBC 驱动 jar。这个环节慢起来,轻则打断写代码的节奏,重则直接卡到超时,测试连接按钮永远是红色。本文不做复杂的网络改造,只把“等它慢慢下载”改成“把驱动文件直接喂到它嘴边”,适合所有使用 IDEA 自带数据库工具的人,包括刚入门的同学,也包括天天维护老项目的老手。

1. 先搞明白:IDEA 下载数据库驱动,卡点到底是什么

1.1 驱动是什么,IDEA 为什么非要现场下载

JDBC 驱动可以理解成 Java 程序访问数据库时的“翻译官”。数据库厂商各自提供驱动 jar,你的 Java 代码不直接跟 MySQL、PostgreSQL 的内部协议打交道,而是通过标准的 java.sql 接口调用驱动,再由驱动把调用翻译成数据库能听懂的指令。IDEA 的数据库工具本质就是一个 JDBC 客户端,它想连上数据库,就必须拿到对应数据库的驱动。

那 IDEA 为什么不把这些 jar 全部塞进安装包?两个原因:一是安装包会膨胀得厉害,二是驱动版本迭代太快,数据库厂商一发布新版,IDE 不可能每次都跟着发新版。所以 IDEA 采用按需下载策略:你新建一个 MySQL 数据源,驱动列表里会有若干候选版本,你选中之后,IDE 再从远程驱动仓库里把对应 jar 拉到本地。

问题就出在这个“远程驱动仓库”上。对国内很多网络环境来说,这条链路的响应速度不稳定,一旦超时,界面就停在 Downloading 状态。更难受的是下载过程没有好的断点续传,你点取消再重试,前面下的部分可能直接丢失,又从头开始。驱动 jar 体积其实并不大,mysql-connector-j 8.x 也就两三兆,Oracle 的 ojdbc 十几兆,真正拖垮你的不是体积,而是反复握手失败、超时重试这些看不见的成本。

1.2 慢的背后是重试成本,不是下载体积

有同学会问:几兆的文件,宽带再慢也不至于要十分钟吧?对,问题不在带宽,而在连接建立的过程。IDEA 下载驱动的默认仓库位于海外链路,中间经过的路由节点一多,TCP 握手和 TLS 握手都可能超时。一旦超时,下载任务不会原地等你,而是报错或者挂起,你在界面上只能看到那个永远不结束的转圈提示。

我自己的体会是,这个转圈提示特别有迷惑性。它看起来还在运行,实际上底层请求可能早就失败了,只是 IDEA 没有把错误细节弹到前台。你取消任务再点一次,它又从头发起一个请求,运气好能下完,运气不好就是无限循环。所以单纯在 UI 上反复重试是最没效率的应对方式。

1.3 应对思路:别让 IDEA 碰远程下载

搞清楚卡点之后,思路就清楚了:既然 IDEA 的自动下载通道不可控,那就绕过它。你要的最终结果只是“Driver files 列表里出现一个可用的 jar”,然后数据源能用这个 jar 建立连接。这个 jar 的来源可以很多:本地 Maven 仓库、Gradle 缓存、公司私服、之前已经下载好的 IDE 缓存,甚至别人的电脑。

所以本文后面三个方案,本质都是在解决同一件事:把驱动 jar 从某个更快的渠道拿过来,再用 IDEA 手动指定。这样既不依赖 IDEA 的远程仓库,也不影响 IDEA 后续的数据库功能。

2. 方案一:从 Maven 仓库把驱动拿到本地,再手动喂给 IDEA

2.1 先确定你需要的驱动坐标

手动下载不能瞎搜,最稳的方法是从 Maven 坐标入手。几乎所有 JDBC 驱动都在 Maven 仓库里发布了标准构件,格式是 groupId:artifactId:version。下表是我常查的几个,可以直接抄作业。

数据库推荐坐标示例驱动类连接 URL 模板
MySQL 8+com.mysql:mysql-connector-j:8.4.0com.mysql.cj.jdbc.Driverjdbc:mysql://localhost:3306/yourdb?serverTimezone=Asia/Shanghai&useSSL=false
MySQL 5.xcom.mysql:mysql-connector-java:5.1.49com.mysql.jdbc.Driverjdbc:mysql://localhost:3306/yourdb?useSSL=false
PostgreSQLorg.postgresql:postgresql:42.7.3org.postgresql.Driverjdbc:postgresql://localhost:5432/yourdb
SQL Servercom.microsoft.sqlserver:mssql-jdbc:12.6.1com.microsoft.sqlserver.jdbc.SQLServerDriverjdbc:sqlserver://localhost:1433;databaseName=yourdb;encrypt=true;trustServerCertificate=true
MariaDBorg.mariadb.jdbc:mariadb-java-client:3.3.3org.mariadb.jdbc.Driverjdbc:mariadb://localhost:3306/yourdb
Oraclecom.oracle.database.jdbc:ojdbc11:23.5.0.24.07oracle.jdbc.OracleDriverjdbc:oracle:thin:@//localhost:1521/yourdb

版本是我写这篇文章时的可用版本,不是唯一选择。你到仓库里找最新修订版本即可。要注意的一点是:如果你的项目本来就在 pom.xml 里引用了某个版本,尽量以项目版本为准,不要在这里拍脑袋换一个大版本。

2.2 最快拿到 jar 的三条路径

第一条路径是直接用 Maven 帮你拉。如果本机装了 Maven,并且在 Maven 的全局 settings.xml 里配置了国内镜像,那么一条命令就能把 jar 拉到本地仓库:

mvn dependency:get -Dartifact=com.mysql:mysql-connector-j:8.4.0

执行完,jar 会出现在本地 Maven 仓库。默认路径是:

~/.m2/repository/com/mysql/mysql-connector-j/8.4.0/mysql-connector-j-8.4.0.jar

如果没有配置镜像,建议打开 settings.xml 看一下。大部分 Java 团队都会在 settings.xml 里配置一个国内云厂商的 Maven 镜像地址,那个地址就是你的快速下载通道,比 IDEA 默认仓库快很多。

第二条路径是从网页手动下载。打开你常用的国内 Maven 镜像站,把坐标拆成目录路径:groupId 里的点换成斜杠,然后一层一层往下进。规律是:

镜像仓库根目录/com/mysql/mysql-connector-j/8.4.0/mysql-connector-j-8.4.0.jar

有命令行基础的同学也可以直接用 curl:

curl -o mysql-connector-j-8.4.0.jar \ 你的镜像仓库根路径/com/mysql/mysql-connector-j/8.4.0/mysql-connector-j-8.4.0.jar

把“你的镜像仓库根路径”换成 settings.xml 里实际配置的值就好。

第三条路径是公司私服。不少团队有内部 Maven 仓库,内网拉取通常比外网快得多。你只需要确认驱动已经部署在私服上,然后在项目 pom.xml 里临时引用一次,让构建过程把 jar 拖进来。之后到本地仓库目录就能拿到。

2.3 IDEA 手动添加驱动文件,步骤拆细

拿到 jar 之后,剩下就是 IDEA 数据源窗口里的操作:

  1. 打开右侧边栏 Database,点击顶部的加号,选择你要连接的数据库类型。
  2. 在数据源配置窗口里,先填连接 URL、用户名、密码,但先别点 Test Connection。
  3. 往下滚动到 “Driver files” 区域,如果里面有一行正在 Downloading,先点取消,不用管它。
  4. 点击 Driver files 区域左上角的加号,选择刚才下载的 jar 文件。列表里会出现一行新的 jar 记录。
  5. 找到 “Driver class” 下拉框,选择表格里对应的驱动全限定类名。
  6. 点 Apply,再点 Test Connection。

手动添加的 jar 和 IDEA 默认下载的驱动文件是并列关系。如果列表里同时存在多个版本,IDE 可能仍会优先使用它默认选中的那个版本,而不是你新加的那一个。所以添加完成后,最好取消勾选 Driver files 列表里除了这个 jar 以外的其他行,让 IDE 从你指定的 jar 里找驱动类。

3. 方案二:让 IDEA 直接复用 Maven/Gradle 本地仓库里的 jar

3.1 为什么这是最省事的方式

如果你已经在用 Maven 管理项目,那大多数情况下,数据库驱动的 jar 早就在你本地了。比如 pom.xml 里引入了 MySQL 驱动,IDEA 在构建项目时已经把依赖解析并下载好。此时本地 Maven 仓库就是一个现成驱动库。

IDEA 要下载一个 mysql-connector-j,而你本地已经躺着同一个坐标的 jar,为什么还要再下一次?直接从本地仓库里把这个 jar 找到,喂给数据源,整个过程完全不需要消耗网络流量,也不会有 Downloading 卡进度条的问题。

3.2 Maven 本地仓库定位 jar

默认的本地 Maven 仓库路径是 ~/.m2/repository。我一般在终端直接用 find 命令:

find ~/.m2/repository -path "*mysql-connector*" -name "*.jar"

想查 PostgreSQL 就把关键字换成 postgresql:

find ~/.m2/repository -path "*postgresql*" -name "*.jar"

找到路径之后,按 2.3 的步骤把这个 jar 手动加进 Driver files 就可以。这里有个小经验:如果本地仓库里同时存在多个版本,优先选和你的数据库服务端大版本匹配的那个。比如服务器是 MySQL 5.7,就别拿 8.4 驱动来连,虽然新驱动对旧服务端多数能向下兼容,但遇到认证插件差异时还是会麻烦。

3.3 Gradle 缓存怎么找

Gradle 项目的 jar 默认在 ~/.gradle/caches/modules-2/files-2.1/ 下,目录按坐标分组,里面还有哈希子目录。结构比 Maven 仓库乱一些,用 find 也能定位:

find ~/.gradle/caches -path "*com/mysql/mysql-connector-j*" -name "*.jar"

因为 Gradle 缓存里会留下多个版本和多次下载记录,选你项目实际使用的那个版本目录即可。拿到路径后,同样是手动加到数据源的 Driver files 里。

3.4 数据源里指定本地 jar 的两个注意点

注意点是驱动类名必须和 jar 版本配套。老的 mysql-connector-java 5.x 驱动类名是 com.mysql.jdbc.Driver,新的 mysql-connector-j 8.x 推荐用 com.mysql.cj.jdbc.Driver,旧类名在新驱动里兼容保留。如果你在 Driver class 下拉框里看不到任何选项,先确认 jar 是否被正确加载,再检查下载下来的 jar 是否完整。

另一个注意点是在 IDEA 中填连接 URL。虽然 IDEA 预置了 URL 模板,但手动切换驱动后 IDE 不会帮你自动调整 URL。按照表格里的模板填,把 localhost 换成实际主机,把 yourdb 换成实际库名,就不会有格式问题。

4. 方案三:把旧机器上已下载好的驱动缓存搬过来

4.1 IDEA 把驱动放在哪个目录

如果你曾经让 IDEA 成功下载过驱动,那么它早就在本地了。IDEA 会为每个驱动建一个子目录,里面放着 jar 文件和描述它的元数据 json。驱动文件目录大致位置如下。

Windows:

C:\Users\你的用户名\AppData\Roaming\<IDEA配置目录>\IntelliJIdea2024.3\jdbc-drivers

macOS:

~/Library/Application Support/<IDEA配置目录>/IntelliJIdea2024.3/jdbc-drivers

Linux:

~/.local/share/<IDEA配置目录>/IntelliJIdea2024.3/jdbc-drivers

新版 IDEA 的版本号可能不同,但目录结构基本一致。你在这个目录下会看到按数据库类型命名的子目录,比如 mysql、postgresql、sqlserver 等,每个子目录里就是对应的 jar 和元数据。

4.2 跨机器、跨版本搬运的注意事项

你完全可以把整个 jdbc-drivers 目录拷贝到新机器的同一位置,新机器上的 IDEA 会认为驱动已经下载完成,不需要再走远程下载。

实际操作中我一般只拷贝自己需要的子目录。举个例子,旧机器上 MySQL 驱动是能用的,你就找到 mysql 相关目录,把整个目录拷到新机器对应的 jdbc-drivers 目录下,重启 IDEA,再打开数据源面板刷新一下,驱动就能识别。

有一点要提前讲:IDEA 版本不同,jdbc-drivers 目录里的元数据记录方式可能不完全一致,老版本拷到新版本不一定被完整识别。遇到这种情况不要慌,直接到对应子目录里把 jar 文件拿出来,按 2.3 的手动添加方式喂给新机器,这一招永远通用。拷贝之前把 IDEA 关掉,避免文件被占用,也避免 IDE 在退出时覆盖你刚放的目录。

5. 常见问题与排障速查表

5.1 下载永远停在 0%

这是最典型的现象。多数时候不是 IDEA 坏了,而是它访问默认驱动仓库的链路不顺畅。我自己的处理顺序是:

  1. 先确认网络整体能正常上网;
  2. 在数据库面板取消当前下载任务;
  3. 换成本文的方案一,从 Maven 镜像仓库手动拿 jar;
  4. 手动加 jar 之后测试连接。

如果你是在已经存在的项目里遇到这个问题,而且项目里本来就有驱动依赖,直接走方案二反而更快。不要在同一批驱动上反复点重试,那样只是在消磨耐心。

5.2 手动添加后找不到驱动类

加了 jar,但 Driver class 下拉框是空的,或者测试连接直接报 ClassNotFoundException,一般有三种原因。

第一种是 jar 没选对。常见场景是你下载到了 sources 包或 javadoc 包,而不是编译好的二进制 jar。看文件名,带 sources、javadoc 后缀的都不是我们要的东西。

第二种是驱动类名不对。老驱动用 com.mysql.jdbc.Driver,新驱动用 com.mysql.cj.jdbc.Driver。PostgreSQL 是 org.postgresql.Driver,SQL Server 是 com.microsoft.sqlserver.jdbc.SQLServerDriver,Oracle 是 oracle.jdbc.OracleDriver。

第三种是 IDEA 加载缓存问题。把 Driver files 里可能加错的 jar 移除,重新添加一次,Apply 之后再点 Driver class 下拉框。还不行就重启一下数据源面板。

5.3 MySQL 连接容易翻车的三个点

第一是时区。使用 8.x 驱动连 MySQL 5.7 或 8.0 时,如果 URL 不带 serverTimezone,会报 “Server returns invalid timezone”。直接改成:

jdbc:mysql://localhost:3306/yourdb?serverTimezone=Asia/Shanghai&useSSL=false

第二是认证插件。MySQL 8.0 默认启用了 caching_sha2_password,老版本 5.x 驱动连不上,会报 “Unable to load authentication plugin”。解决办法是换 8.x 驱动,并在 URL 里追加:

&allowPublicKeyRetrieval=true

第三是老驱动连新服务器整体不可用。如果项目为了兼容历史包袱一直用 5.1.49,连 8.0 数据库时建议直接升级驱动版本,不要在连接串上反复折腾。

5.4 其他数据库的驱动细节

PostgreSQL 的驱动一般一个 jar 就够,URL 模板也固定,问题相对少。SQL Server 12.x 之后的驱动默认要求加密连接,本机测试时可以在 URL 后面加 encrypt=true;trustServerCertificate=true,注意用分号分隔,不是 URL 参数常见的 &。Oracle 的 ojdbc11 和 ojdbc8 对应不同 JDK 版本,本地 JDK 是 8 就选 ojdbc8,是 11 及以上就选 ojdbc11。选错了往往会在连接时冒出版本不兼容的报错,而驱动文件本身看着又是正常的。

5.5 我现在最常用的固定流程

把上面的经验整理下来,我现在处理 IDEA 驱动下载慢的方法已经变成一条固定流水线:

  1. 先到项目 pom.xml 或者本地仓库里确认自己该用的驱动坐标;
  2. 用 mvn dependency:get 从镜像仓库拉 jar,或者直接翻本地 Maven/Gradle 缓存找现成 jar;
  3. 在数据源 Driver files 里点加号添加 jar,勾选匹配的驱动类;
  4. 按表格里的 URL 模板填连接串并测试。

这套流程大概两分钟就完事,比在 IDEA 里长时间耗着等下载靠谱得多。如果你同时管理着几台开发机,方案三的缓存搬运也能省下不少时间。遇到同样问题的朋友,直接从方案一入手,五分钟后回来连接数据库,那种顺畅感真的很值得。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进