0

HikariCP 版本:2.7.9 JDK 版本:1.8.0_111 数据库:MySQL

例外

HikariPool-1 - 池初始化期间出现异常。2018-06-28 21:09:36.545 WARN 35084 --- [nio-8008-exec-2] czhpPoolBase:HikariPool-1 - 默认事务隔离级别检测失败(代理警告 - 靠近“.”:语法错误)。java.sql.SQLException:代理警告 - 靠近“。”:com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)处的语法错误〜[mysql-connector-java-5.1.46.jar:5.1.46 ] 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976) ~[mysql-connector-java-5.1.46.jar:5.1.46] 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java :3912) ~[mysql-connector-java-5.1.46.jar:5.1.46] at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530) ~[mysql-connector-java-5.1.46. jar:5.1.46] 在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683) ~[mysql-connector-java-5.1.46.jar:5.1.46] 在 com.mysql.jdbc。

我的项目使用springboot 2.0,默认集成hikari 2.7.9。

配置自定义数据源:

@Bean(name = "xxOrderDSProperties")
@Qualifier("xxOrderDSProperties")
@ConfigurationProperties(prefix = "spring.datasource.datasource-xxorder")
public DataSourceProperties xxOrderDSProperties(){
    return new DataSourceProperties();
}

@Bean(name = "xxorderDS")
@ConfigurationProperties(prefix = "spring.datasource.datasource-xxorder")
public DataSource dataSourcexxOrder(){
    //return DruidDataSourceBuilder.create().build(); **//this could work**.
    return xxOrderDSProperties().initializeDataSourceBuilder().build(); //**this throws above exception**
}

配置属性 application.yaml: spring: datasource: datasource-xxorder: type: com.zaxxer.hikari.HikariDataSource name: datasource-xxorder url: jdbc:mysql://{$host}:{$port}/db?characterEncoding= UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull 用户名:userxx 密码:pwdxx 驱动程序类名:com.mysql.jdbc.Driver

我调试了源代码,发现上面抛出异常的代码:

try {
defaultTransactionIsolation = connection.getTransactionIsolation();
if (transactionIsolation == -1) {
transactionIsolation = defaultTransactionIsolation;
}
}
catch (SQLException e) {
LOGGER.warn("{} - Default transaction isolation level detection failed ({}).", poolName, e.getMessage());
if (e.getSQLState() != null && !e.getSQLState().startsWith("08")) {
throw e;
}

我发现连接只有一个名为“isolationLevel”的属性,而不是“transactionIsolation”,并且 getTransactionIsolation 总是会出现异常。

然后我将它与德鲁伊进行比较。德鲁伊可以跳过这个异常。并连接,执行sql操作成功。德鲁伊的代码:

try {
this.underlyingTransactionIsolation = conn.getTransactionIsolation();
} catch (SQLException e) {
// compartible for alibaba corba
if ("HY000".equals(e.getSQLState())
|| "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException".equals(e.getClass().getName())) {
// skip
} else {
throw e;
}
}

我想知道在用mybatis配置访问mysql时如何让hikariCP和springboot一起正常工作?有什么建议吗?

谢谢。

4

1 回答 1

0

找到了原因。我们使用 atlas 作为 db 中间件,在使用 hikari getTransactionIsolation 时它不支持命令“SELECT @@session.tx_isolation”。它会抛出异常“错误1105(HY000):代理警告-靠近“。”:语法错误”

但是,druid 跳过了这个语法异常。并可以成功执行以下sql。

解决方案:

1.如果hikari可以像druid一样跳过这个异常,就可以解决了。2.如果atlas可以支持“SELECT @@session.tx_isolation”命令,它会起作用。3.改成德鲁伊。

于 2018-06-29T10:02:27.043 回答