You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JRuby升级至Java 11后使用java.sql.DriverManager连接MySQL失败

JRuby升级至Java 11后DriverManager无法找到MySQL驱动的问题解决

问题原因

  1. Java 11模块化(JPMS)的影响:Java 9及以后引入的模块化系统改变了DriverManager的驱动发现逻辑,不再自动通过META-INF/services/java.sql.Driver文件扫描加载驱动。JRuby的类加载器在Java 11环境下,无法自动将MySQL驱动注册到DriverManager中,导致调用get_connection时找不到合适驱动。
  2. 代码语法错误:原代码中存在无效语句jdbc-mysql,会干扰代码执行流程,同时加载驱动后没有显式向DriverManager注册驱动实例。
  3. JRuby版本兼容性:旧版本JRuby对Java 11的JDBC支持不完善,需要使用适配Java 11的JRuby版本(如JRuby 9.2.x及以上)。

解决办法

1. 修复代码并显式注册驱动

删除无效语句,加载驱动后手动向DriverManager注册驱动实例,确保DriverManager能识别到驱动:

require 'java'
require 'jdbc/mysql'

# 加载MySQL JDBC驱动
Jdbc::MySQL.load_driver
# 显式注册驱动到DriverManager
java.sql.DriverManager.registerDriver(Java::com.mysql.cj.jdbc.Driver.new)

# 建立连接
url = "jdbc:mysql://localhost/mydatabase?user=root"
conn = java.sql.DriverManager.get_connection(url)

2. 使用jdbc/mysql gem的封装方法

jdbc/mysql gem提供了更简洁的连接方式,内部已处理驱动注册逻辑,避免直接操作DriverManager的问题:

require 'jdbc/mysql'
Jdbc::MySQL.load_driver

# 使用gem内置的连接方法
conn = Jdbc::MySQL.connect(
  "jdbc:mysql://localhost/mydatabase",
  "root",
  "" # 密码为空则传空字符串
)

3. 升级JRuby版本

确保使用的JRuby版本兼容Java 11,推荐使用JRuby 9.2.17.0及以上版本,这类版本对Java 11的类加载和JDBC驱动处理做了针对性适配。

补充说明

你能通过直接创建Driver实例并调用connect成功,是因为这种方式绕过了DriverManager的服务发现机制,直接调用驱动类的连接方法,不受Java 11模块化的影响。而DriverManager在Java 11下必须显式注册驱动才能识别。

内容的提问来源于stack exchange,提问作者DBulgatz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:51:36