JRuby升级至Java 11后使用java.sql.DriverManager连接MySQL失败
JRuby升级至Java 11后DriverManager无法找到MySQL驱动的问题解决
问题原因
- Java 11模块化(JPMS)的影响:Java 9及以后引入的模块化系统改变了
DriverManager的驱动发现逻辑,不再自动通过META-INF/services/java.sql.Driver文件扫描加载驱动。JRuby的类加载器在Java 11环境下,无法自动将MySQL驱动注册到DriverManager中,导致调用get_connection时找不到合适驱动。 - 代码语法错误:原代码中存在无效语句
jdbc-mysql,会干扰代码执行流程,同时加载驱动后没有显式向DriverManager注册驱动实例。 - 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
相关产品推荐
相关产品推荐

