mariadb-java-client 2.2.3兼容MySQL 8.0吗?报错求解决方案
tx_isolation异常问题 这个问题我之前也碰到过,本质是MariaDB JDBC驱动2.2.3版本还在使用MySQL 8.0.3+已经移除的tx_isolation系统变量,而MySQL 8.0.11完全不再支持这个变量了。下面给你几个可行的解决办法,按推荐优先级排序:
1. 升级MariaDB JDBC驱动版本(最推荐)
MariaDB在2.3.0及以上版本的驱动已经修复了这个兼容性问题,会自动适配MySQL 8.0使用的transaction_isolation变量。你只需要修改项目依赖:
如果是Maven项目,更新pom.xml中的依赖:
<dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <version>2.3.0</version> <!-- 或更高稳定版本,比如2.7.5 --> </dependency>
如果是Gradle项目,更新build.gradle:
implementation 'org.mariadb.jdbc:mariadb-java-client:2.3.0'
这个方案最彻底,后续也能避免其他潜在的兼容性问题,而且2.3.0版本和Spring Boot 2.0.2完全兼容。
2. 临时 workaround:修改JDBC连接参数
如果暂时没法升级驱动,可以在JDBC URL中添加参数,强制驱动使用新的事务隔离变量:
jdbc:mariadb://localhost:3306/your_database?useLegacyDatetimeCode=false&sessionVariables=transaction_isolation='READ-COMMITTED'
这里的READ-COMMITTED可以替换成你实际需要的事务隔离级别(比如REPEATABLE-READ),这个参数会在连接初始化时设置正确的系统变量,绕过驱动对旧变量的读取。
3. 替换为MySQL官方JDBC驱动
如果你不想继续使用MariaDB的驱动,也可以换成MySQL官方的mysql-connector-java,Spring Boot 2.0.2对这个驱动的8.0版本支持很好:
Maven依赖:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> <!-- 和你的MySQL版本匹配 --> </dependency>
同时记得把JDBC URL改成mysql协议开头,并且添加时区参数:
jdbc:mysql://localhost:3306/your_database?serverTimezone=UTC&useSSL=false
补充说明
MySQL 8.0.3的更新中正式移除了tx_isolation变量,改用transaction_isolation(还有对应的transaction_read_only),老版本的MariaDB驱动没有做版本适配,还是尝试读取旧变量名,所以触发了这个SQLException。升级驱动是长远来看最稳妥的方案,建议优先选择。
内容的提问来源于stack exchange,提问作者Joseph Madden

