使用 spring R2DBC 连接 mySQL 服务器版本 8 时出现未知系统变量 'tx_isolation'
Unknown system variable 'tx_isolation' when using spring R2DBC to connect with a mySQL server version 8
我使用 IntelliJ Idea 的 spring 初始化程序创建了一个新的 spring 引导项目,并检查了 Web/Spring reactive Web
和 SQL/Spring data R2DBC
依赖项。
我还为 MySQL
添加了对 R2DBC 实现的依赖
<dependency>
<groupId>dev.miku</groupId>
<artifactId>r2dbc-mysql</artifactId>
<version>0.8.2.RELEASE</version>
</dependency>
和java连接器
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
从控制台询问 MySQL 服务器的版本
select version();
我得到
8.0.17
连接工厂配置是这样的:
@Configuration
@RequiredArgsConstructor
public class R2dbcConfig extends AbstractR2dbcConfiguration {
@Bean
public ConnectionFactory connectionFactory() {
ConnectionFactoryOptions conf = ConnectionFactoryOptions.builder()
.option(DRIVER, "mysql")
.option(HOST, "the.db.url")
.option(PORT, 33066612)
.option(USER, "myUserName")
.option(PASSWORD, "myPassword")
.option(DATABASE, "aDbName")
.build();
return ConnectionFactories.find(conf);
}
}
然而,当我 运行 应用程序时,我得到以下异常
reactor.core.Exceptions$ErrorCallbackNotImplemented: org.springframework.dao.DataAccessResourceFailureException: Failed to obtain R2DBC Connection; nested exception is io.r2dbc.spi.R2dbcNonTransientResourceException: [1193] Unknown system variable 'tx_isolation'
Caused by: org.springframework.dao.DataAccessResourceFailureException: Failed to obtain R2DBC Connection; nested exception is io.r2dbc.spi.R2dbcNonTransientResourceException: [1193] Unknown system variable 'tx_isolation'
类似问题的答案指示提问者将 mysql:mysql-connector-java
的版本更新为 8.+
,根据 IntelliJ,maven 解析的版本是 8.0.26
。
奇怪的是,如果我删除连接器依赖项,结果是完全一样的。
因此,我调试了 R2DBC 实现以了解发生了什么,我发现在握手期间,dev.miku.r2dbc.mysq.QueryFlow#initHandshake
方法收到一条 HandshakeRequest
消息,其中 headers 告诉服务器版本是“5.5.30”。这导致 R2DBC 实现使用旧的“tx_isolation”系统变量名称而不是新的“transaction_isolation”。
为什么?
我错过了什么?
https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html 说:
The tx_isolation
and tx_read_only
system variables have been removed. Use transaction_isolation
and transaction_read_only
instead.
您检查发现服务器版本为8.0.17。这比握手消息更权威。
我建议在您的类路径中搜索旧版本连接器的任何剩余 jar 文件。您可能同时拥有 8.0.26 版本的连接器和尚未更新为使用新选项名称的旧版本。
你能解决吗?我发现 R2dbc mysql 驱动程序没有得到我的 MySql 版本,因为它会检查它以询问 tx_isolation 或 transaction_isolation.
我得到的解决方案是将驱动程序更改为 Jasync。
//DB
implementation("com.github.jasync-sql:jasync-r2dbc-mysql:2.0.4")
implementation("io.r2dbc:r2dbc-h2")
implementation("org.springframework.boot:spring-boot-starter-data-r2dbc:2.6.0")
我的配置:
@Configuration
@EnableTransactionManagement
@EnableConfigurationProperties(DbPropertiesConfig::class)
class DataSourceConfiguration {
@Configuration
class ProdMySQLConfiguration(@Autowired val dbPropertiesConfig: DbPropertiesConfig) : AbstractR2dbcConfiguration() {
@Bean
override fun connectionFactory(): ConnectionFactory =
JasyncConnectionFactory(MySQLConnectionFactory(
com.github.jasync.sql.db.Configuration(
database = dbPropertiesConfig.db,
port = dbPropertiesConfig.port,
username = dbPropertiesConfig.username,
host = dbPropertiesConfig.host,
password = dbPropertiesConfig.password
)
))
}
}
考虑到我的 yml 中有 DbPropertiesConfig。
我使用 IntelliJ Idea 的 spring 初始化程序创建了一个新的 spring 引导项目,并检查了 Web/Spring reactive Web
和 SQL/Spring data R2DBC
依赖项。
我还为 MySQL
添加了对 R2DBC 实现的依赖 <dependency>
<groupId>dev.miku</groupId>
<artifactId>r2dbc-mysql</artifactId>
<version>0.8.2.RELEASE</version>
</dependency>
和java连接器
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
从控制台询问 MySQL 服务器的版本
select version();
我得到
8.0.17
连接工厂配置是这样的:
@Configuration
@RequiredArgsConstructor
public class R2dbcConfig extends AbstractR2dbcConfiguration {
@Bean
public ConnectionFactory connectionFactory() {
ConnectionFactoryOptions conf = ConnectionFactoryOptions.builder()
.option(DRIVER, "mysql")
.option(HOST, "the.db.url")
.option(PORT, 33066612)
.option(USER, "myUserName")
.option(PASSWORD, "myPassword")
.option(DATABASE, "aDbName")
.build();
return ConnectionFactories.find(conf);
}
}
然而,当我 运行 应用程序时,我得到以下异常
reactor.core.Exceptions$ErrorCallbackNotImplemented: org.springframework.dao.DataAccessResourceFailureException: Failed to obtain R2DBC Connection; nested exception is io.r2dbc.spi.R2dbcNonTransientResourceException: [1193] Unknown system variable 'tx_isolation'
Caused by: org.springframework.dao.DataAccessResourceFailureException: Failed to obtain R2DBC Connection; nested exception is io.r2dbc.spi.R2dbcNonTransientResourceException: [1193] Unknown system variable 'tx_isolation'
类似问题的答案指示提问者将 mysql:mysql-connector-java
的版本更新为 8.+
,根据 IntelliJ,maven 解析的版本是 8.0.26
。
奇怪的是,如果我删除连接器依赖项,结果是完全一样的。
因此,我调试了 R2DBC 实现以了解发生了什么,我发现在握手期间,dev.miku.r2dbc.mysq.QueryFlow#initHandshake
方法收到一条 HandshakeRequest
消息,其中 headers 告诉服务器版本是“5.5.30”。这导致 R2DBC 实现使用旧的“tx_isolation”系统变量名称而不是新的“transaction_isolation”。
为什么? 我错过了什么?
https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html 说:
The
tx_isolation
andtx_read_only
system variables have been removed. Usetransaction_isolation
andtransaction_read_only
instead.
您检查发现服务器版本为8.0.17。这比握手消息更权威。
我建议在您的类路径中搜索旧版本连接器的任何剩余 jar 文件。您可能同时拥有 8.0.26 版本的连接器和尚未更新为使用新选项名称的旧版本。
你能解决吗?我发现 R2dbc mysql 驱动程序没有得到我的 MySql 版本,因为它会检查它以询问 tx_isolation 或 transaction_isolation.
我得到的解决方案是将驱动程序更改为 Jasync。
//DB
implementation("com.github.jasync-sql:jasync-r2dbc-mysql:2.0.4")
implementation("io.r2dbc:r2dbc-h2")
implementation("org.springframework.boot:spring-boot-starter-data-r2dbc:2.6.0")
我的配置:
@Configuration
@EnableTransactionManagement
@EnableConfigurationProperties(DbPropertiesConfig::class)
class DataSourceConfiguration {
@Configuration
class ProdMySQLConfiguration(@Autowired val dbPropertiesConfig: DbPropertiesConfig) : AbstractR2dbcConfiguration() {
@Bean
override fun connectionFactory(): ConnectionFactory =
JasyncConnectionFactory(MySQLConnectionFactory(
com.github.jasync.sql.db.Configuration(
database = dbPropertiesConfig.db,
port = dbPropertiesConfig.port,
username = dbPropertiesConfig.username,
host = dbPropertiesConfig.host,
password = dbPropertiesConfig.password
)
))
}
}
考虑到我的 yml 中有 DbPropertiesConfig。