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] at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683) ~[mysql-connector-java-5.1.46.jar:5.1.46] at 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**
}

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 ドライバークラス名: 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;
}

接続には「transactionIsolation」ではなく「isolationLevel」という名前のプロパティがあり、getTransactionIsolation は常に例外を取得することがわかりました。

次に、ドルイドと比較します。druid はこの例外をスキップできます。接続し、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;
}
}

mysql にアクセスするために mybatis を使用して構成するときに、hikariCP を springboot で正しく動作させる方法を知りたいですか?何か提案はありますか?

ありがとう。

4

1 に答える 1

0

理由が見つかりました。db ミドルウェアとして atlas を使用していますが、hikari getTransactionIsolation を使用した場合、コマンド「SELECT @@session.tx_isolation」をサポートできませんでした。例外「エラー 1105 (HY000): プロキシ警告 - "." の近く: 構文エラー」がスローされます。

ただし、druid はこの構文例外をスキップします。次のSQL成功を実行できます。

ソリューション:

1.ヒカリがドルイドのようにこの例外をスキップできれば解決します。2.アトラスがコマンド「SELECT @@session.tx_isolation」をサポートできる場合、それは機能します。3.ドルイドに変更するだけです。

于 2018-06-29T10:02:27.043 に答える