Zipkin与Mysql8版本异常: java.sql.SQLException: (conn=106) Unknown system variable ‘tx_isolation’(mariadb)
Zipkin版本:zipkin-server-2.9.4-exec.jar
Mysql版本:mysql-8.0.15-winx64
在Zipkin搭建启动服务,通过powershell正常启动
异常分析
当访问页面时,出现以下异常:http://localhost:8402/zipkin/
前端:
后台报错:
从Hikari到mariadb,先定位到mariadb的数据库连接:
定位到:MariaDbConnection.class
这个类在zipkin-server-2.9.4-exec.jar的mariadb-java-client-2.2.3.jar里面
MariaDbConnection.class
public class MariaDbConnection implements Connection {
... ...
public int getTransactionIsolation() throws SQLException {
Statement stmt = this.createStatement();
Throwable var2 = null;
try {
//Mysql8.0.X之后将tx_isolation修改成了transaction_isolation
ResultSet rs = stmt.executeQuery("SELECT @@tx_isolation");
Throwable var4 = null;
try {
if (!rs.next()) {
throw ExceptionMapper.getSqlException("Could not get transaction isolation level");
} else {
String response = rs.getString(1);
byte var7 = -1;
switch(response.hashCode()) {
case -1296331988:
if (response.equals("READ-UNCOMMITTED")) {
var7 = 1;
}
break;
case -1116651265:
if (response.equals("SERIALIZABLE")) {
var7 = 3;
}
break;
case -718034194:
if (response.equals("REPEATABLE-READ")) {
var7 = 0;
}
break;
case 1633007589:
if (response.equals("READ-COMMITTED")) {
var7 = 2;
}
}
byte var8;
switch(var7) {
case 0:
var8 = 4;
return var8;
case 1:
var8 = 1;
return var8;
case 2:
var8 = 2;
return var8;
case 3:
var8 = 8;
return var8;
default:
throw ExceptionMapper.getSqlException("Could not get transaction isolation level: Invalid @@tx_isolation value \"" + response + "\"");
}
}
} catch (Throwable var43) {
var4 = var43;
throw var43;
} finally {
if (rs != null) {
if (var4 != null) {
try {
rs.close();
} catch (Throwable var42) {
var4.addSuppressed(var42);
}
} else {
rs.close();
}
}
}
} catch (Throwable var45) {
var2 = var45;
throw var45;
} finally {
if (stmt != null) {
if (var2 != null) {
try {
stmt.close();
} catch (Throwable var41) {
var2.addSuppressed(var41);
}
} else {
stmt.close();
}
}
}
}
... ...
}
解决方案:
下载:zipkin-server-2.12.9-exec.jar
使用该版本的的zipkin,没有报错,
里面的mariadb是mariadb-java-client-2.4.1.jar版本
MariaDbConnection.class
public class MariaDbConnection implements Connection {
public int getTransactionIsolation() throws SQLException {
Statement stmt = this.createStatement();
String sql = "SELECT @@tx_isolation";
//这里根据连接数据库的协议获取到相关版本做了校验
if (!this.protocol.isServerMariaDb() && (this.protocol.getMajorServerVersion() >= 8 && this.protocol.versionGreaterOrEqual(8, 0, 3) || this.protocol.getMajorServerVersion() < 8 && this.protocol.versionGreaterOrEqual(5, 7, 20))) {
sql = "SELECT @@transaction_isolation";
}
... ...
}
... ...
}
测试结果:未报错