弹簧靴2.0 集成 HikariCP2.7.9,抛出"Default transaction isolation level detection failed (Proxy Warning - nea



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

异常

HikariPool-1-池初始化期间出现异常。2018-06-28 21:09:36.545警告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]在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]在com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)~[mysql-connector-java-5.1.46.jar:5.1.46]在com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2482)~[mysql-connector-java-5.1.46.jar:5.1.46]在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]在com.mysql.jdbc.ConnectionImpl.getTransactionIsolation(ConnectionImpl.java:3001)~[mysql-connector-java-5.1.46.jar:5.1.46]网址:com.zaxxer.hikari.pool.PoolBase.checkDriverSupport(PoolBase.java:457)~[HikariCP-2.7.9.jar:?]网址:com.zaxxer.hikari.pool.PoolBase.setupConnection(PoolBase.java:412)~[HikariCP-2.7.9.jar:?]网址: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:?]网址:com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:460)[HikariCP-2.7.9.jar:?]网址:com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:534)[HikariCP-2.7.9.jar:?]网址:com.zaxxer.hikari.pool.HikariPool。(HikariPool.java:115)[HikariCP-2.7.9.jar:?]访问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.RELENSE]位于org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:115)[spring-jdbc-5.0.6.RELEASE.jar:5.0.6.REASE]在org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:78)[spring-jdbc-5.0.6.RELEASE.jar:5.0.6.REASE]网址:org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTranslation.java:82)[mybatis-spring-1.32.jar:1.3.2]网址:org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTranslation.java:68)[mybatis-spring-1.32.jar:1.3.2]网址:org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:338)[mybatis-3.4.6.jar:3.4.6]网址:org.apache.ibati.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:84)[mybatis-3.4.6.jar:3.4.6]网址:org.apache.ibati.executor.SimpleExecutiator.doQuery(SimpleExecutiator.java:62)[mybatis-3.4.6.jar:3.4.6]网址:org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:326)[mybatis-3.4.6.jar:3.4.6]网址:org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)[mybatis-3.4.6.jar:3.4.6]网址:org.apache.ibati.executor.CachingExecutor.query(CachingExecutor.java:109)[mybatis-3.4.6.jar:3.4.6]网址:org.apache.ibati.executor.CachingExecutor.query(CachingExecutor.java:83)[mybatis-3.4.6.jar:3.4.6]在org.apache.ibati.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)[mybatis-3.4.6.jar:3.4.6]在org.apache.ibati.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)[mybatis-3.4.6.jar:3.4.6]在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[?:1.8.0_101]在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)~[?:1.8.0_101]在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)~[?:1.8.0_101]位于java.lang.reflect.Method.ioke(Method.java:498)~[?:1.8.0_101]网址:org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.ioke(SqlSessionTemplate.java:433)[mybatis-spring-1.32.jar:1.3.2]网址:com.sun.proxy.$Proxy92.selectList(未知来源)[?:?]网址:org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)[mybatis-spring-1.32.jar:1.3.2]网址:org.apache.ibati.binding.MapperMethod.executeForMany(MapperMethod.java:139)[mybatis-3.4.6.jar:3.4.6]在org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:76)[mybatis-3.4.6.jar:3.4.6]在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**
}

配置属性application.yaml:弹簧:数据源:数据源xx顺序:类型:com.zaxxer.hikari.HikariDataSource名称:数据源xxorderurl: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一起工作有什么建议吗?

谢谢。

找到原因。我们使用atlas作为数据库中间件,当使用hikari getTransactionIsolation时,它无法支持命令"SELECT@@session.tx_isolation"。并且它将抛出异常"ERROR 1105(HY000):Proxy Warning-near"。":语法错误">

然而,德鲁伊跳过了这个语法异常。并且可以执行以下sql成功。

解决方案:

1.如果希卡里能像德鲁伊一样跳过这个异常,它就会被解决。2.如果atlas可以支持命令"SELECT@@session.tx_isolation",它就会工作。3.换成德鲁伊就行了。

最新更新