小编Ama*_*wat的帖子

@Transactional 上的 MySQL 套接字超时行为

我正在使用 spring-boot (2.3.4.RELEASE) 和 MySQL (8.0.21)。

我在 Spring Boot 中的数据库配置是

spring.datasource.url=jdbc:mysql://localhost:3306/testDB?connectTimeout=2000&socketTimeout=10000&autoReconnect=true&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=toor
spring.datasource.dbcp2.test-while-idle=true
spring.datasource.dbcp2.pool-prepared-statements=true
spring.datasource.dbcp2.validation-query=SELECT 1 from dual where @@innodb_read_only = 0
spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
Run Code Online (Sandbox Code Playgroud)
MySQL 连接器
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.18</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
DBCP2
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-dbcp2</artifactId>
    <version>2.1.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我测试了以下代码模板并发现了这种奇怪的行为
@Autowired
private NamedParameterJdbcTemplate jdbcTemplate;

@Transactional
public void f1() {
  jdbcTemplate.queryForObject("SELECT sleep(12)", new HashMap<>(), Integer.class);
}
Run Code Online (Sandbox Code Playgroud)
@Autowired
private NamedParameterJdbcTemplate jdbcTemplate;

@Transactional
public void f2() {
  Thread.sleep(12000);
  jdbcTemplate.queryForObject("SELECT count(*) from my_table", new HashMap<>(), Integer.class);
}
Run Code Online (Sandbox Code Playgroud)
第一个函数给出了这个错误:
11:10:07.862 [qtp262911569-27] ERROR o.s.t.i.TransactionInterceptor - Application exception overridden …
Run Code Online (Sandbox Code Playgroud)

java mysql spring-boot

5
推荐指数
1
解决办法
1096
查看次数

标签 统计

java ×1

mysql ×1

spring-boot ×1