首页 文章

springboot2.0集成hikariCP2.7.9,抛出“默认事务隔离级别检测失败(代理警告 - 附近” . “:语法错误) . ”

提问于
浏览
0

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

Exception

HikariPool-1 - 池初始化期间的异常 . 2018-06-28 21:09:36.545 WARN 35084 --- [nio-8008-exec-2] c.z.h.p.PoolBase: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] at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java) :3912)〜[mysql-connector-java-5.1.46.jar:5.1.46]在com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)〜[mysql-connector-java-5.1.46 . jar:5.1.46] at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)〜[mysql-connector-java-5.1.46.jar:5.1.46] at com.mysql.jdbc.ConnectionImpl . execSQL(ConnectionImpl.java:2482)〜[mysql-connector-java-5.1.46.jar:5.1.46] at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2440)〜[mysql-connector-java -5.1.46.jar:5.1.46] com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1381)〜[mysql-connector-java-5.1.46.jar:5.1.46] at com.mysql .jdbc.ConnectionImpl.getTransactionIsolation(ConnectionImpl.java:3001)〜[mysql-c onnector-java-5.1.46.jar:5.1.46]在com.zaxxer的com.zaxxer.hikari.pool.PoolBase.checkDriverSupport(PoolBase.java:457)〜[HikariCP-2.7.9.jar:?] . hikari.pool.PoolBase.setupConnection(PoolBase.java:412)〜[HikariCP-2.7.9.jar:?] at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:370)~ [HikariCP-2.7 .9.jar:?] com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:194)〜[HikariCP-2.7.9.jar:?] at com.zaxxer.hikari.pool.HikariPool.createPoolEntry (HikariPool.java:460)[HikariCP-2.7.9.jar:?] at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:534)[HikariCP-2.7.9.jar:?] at com .zaxxer.hikari.pool.HikariPool . (HikariPool.java:115)[HikariCP-2.7.9.jar:?] at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)[HikariCP-2.7.9 .jar:?] org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:151)[spring-jdbc-5.0.6.RELEASE.jar:5.0.6.RELEASE] org.springframework.jdbc . datasource.DataSourceUtils.doGetConnection(DAT orS.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:78)[spring-jdbc-5.0] .6.RELEASE.jar:5.0.6.RELEASE] org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:82)[mybatis-spring-1.3.2.jar:1.3.2] at org . orb.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:338)中的mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:68)[mybatis-spring-1.3.2.jar:1.3.2] [orbatis-3.4.6.jar:3.4.6]在org.apache的org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:84)[mybatis-3.4.6.jar:3.4.6] . ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:326)[mybatis-3.4 .6.jar:3.4.6] at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)[mybati s-3.4.6.jar:3.4.6]在org.apache.ibatis的org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)[mybatis-3.4.6.jar:3.4.6] .executor.CachingExecutor.query(CachingExecutor.java:83)[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)[mybatis- 3.4.6.jar:3.4.6] atg.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)[mybatis-3.4.6.jar:3.4.6] at sun.reflect.NativeMethodAccessorImpl .invoke0(Native Method)〜[?:1.8.0_101] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)〜[?:1.8.0_101] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43)〜[?:1.8.0_101] at java.lang.reflect.Method.invoke(Method.java:498)〜[?:1.8.0_101] at org.mybatis.spring.SqlSessionTemplate $ SqlSessionInterceptor.invoke(SqlSessionTemplate . java:433)[mybatis-spring-1.3.2.jar:1.3.2] at com.sun.proxy . $ Proxy92.selectList(Unknown Source)[? :?org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)[mybatis-spring-1.3.2.jar:1.3.2] at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod . java:139)[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:76)[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)[mybatis-3.4.6.jar:3.4.6]

我的项目使用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**
}

config属性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 driver-class-name: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?有什么建议吗?

谢谢 .

1 回答

  • 0

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

    但是,德鲁伊跳过这个语法异常 . 并且可以执行以下sql成功 .

    解决方案:

    如果hikari可以像德鲁伊一样跳过这个例外,它将被解决 . 2.如果atlas可以支持命令“SELECT @@ session.tx_isolation”,它将起作用 . 3.只能改变德鲁伊 .

相关问题