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

时间:2018-06-29 06:26:57

标签: spring-boot hikaricp spring-mybatis multi-database

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] 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.RELEASE] 在org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:115)[spring-jdbc-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在org.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] 在org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:68)[mybatis-spring-1.3.2.jar:1.3.2] 在org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:338)上[mybatis-3.4.6.jar:3.4.6] 在org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:84)上[mybatis-3.4.6.jar:3.4.6] 在org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.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.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)上[mybatis-3.4.6.jar:3.4.6] 在org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)上[mybatis-3.4.6.jar:3.4.6] 在org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)[mybatis-3.4.6.jar:3.4.6] 在org.apache.ibatis.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.invoke(Method.java:498)〜[?:1.8.0_101] 在org.mybatis.spring.SqlSessionTemplate $ SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)[mybatis-spring-1.3.2.jar:1.3.2] 在com.sun.proxy。$ Proxy92.selectList(未知来源)[?:?] 在org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)[mybatis-spring-1.3.2.jar:1.3.2] 在org.apache.ibatis.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: 弹簧: 数据源: 数据源-xxorder: 类型:com.zaxxer.hikari.HikariDataSource 名称:数据源-xxorder 网址: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一起正常工作吗?有什么建议吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

找到原因。 我们将地图集用作数据库中间件,使用hikari getTransactionIsolation时,它不支持命令“ SELECT @@ session.tx_isolation”。它将引发异常“错误1105(HY000):代理警告-靠近“。”:语法错误”

但是,德鲁伊会跳过此语法异常。并可以执行以下sql成功。

解决方案:

1。如果hikari可以像druid一样跳过此异常,它将得到解决。 2.如果地图集可以支持命令“ SELECT @@ session.tx_isolation”,则它将起作用。 3.只是换成德鲁伊。