Мой весенний загрузочный проект иногда не может восстановить соединение из-за тайм-аута запроса.Чтобы устранить эту проблему, я пытаюсь воссоздать проблему, установив одну и ту же конфигурацию для базы данных и моего проекта весенней загрузки, но я все еще не могу получить то исключение, которое хочу получить.Как я могу воссоздать эту проблему?
Вот конфигурация базы данных для тайм-аута
connect_timeout 10
delayed_insert_timeout 300
have_statement_timeout YES
innodb_flush_log_at_timeout 1
innodb_lock_wait_timeout 50
innodb_rollback_on_timeout OFF
interactive_timeout 28800
lock_wait_timeout 31536000
mysqlx_connect_timeout 30
mysqlx_idle_worker_thread_timeout 60
mysqlx_interactive_timeout 28800
mysqlx_port_open_timeout 0
mysqlx_read_timeout 30
mysqlx_wait_timeout 28800
mysqlx_write_timeout 60
net_read_timeout 30
net_write_timeout 60
rpl_stop_slave_timeout 31536000
slave_net_timeout 60
wait_timeout 28800
Моя конфигурация загрузки Spring
spring.datasource.url=jdbc:mysql://server:3306/dbtest?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=[password]
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop
spring.jpa.show-sql=true
spring.datasource.hikari.leak-detection-threshold=30000
spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.max-lifetime=180000
spring.datasource.hikari.idle-timeout=120000
spring.datasource.hikari.maximum-pool-size=1
В моем классе контроллера это имеетследующее:
package com.example.dbpool.controller;
import com.example.dbpool.entity.ResultEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
@RestController
@Slf4j
public class RestfulController {
@Autowired
JdbcTemplate jdbcTemplate;
@GetMapping(value = "/test")
public ResponseEntity<ResultEntity> test() throws InterruptedException{
//LOGGER.info("Logger test");
dbtest();
ResultEntity result = ResultEntity.builder().result("SUCCESS").build();
return new ResponseEntity<>(result, HttpStatus.OK);
}
public void dbtest() throws InterruptedException {
LocalDateTime now = LocalDateTime.now();
LOGGER.info("DB test on {} on schedule 1", now);
String transactionId = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + String
.format("%07d", ThreadLocalRandom.current().nextInt(0, 10000000));
jdbcTemplate.update("insert into timeouttest(transactionid, request) values (?,?)", transactionId,
UUID.randomUUID().toString());
LOGGER.info("Sleep for 1 minute");
Thread.sleep(60000);
LOGGER.info("Begin to update response");
int rows = jdbcTemplate
.update("update timeouttest set Response = ? where transactionid = ?", "SUCCESS", transactionId);
LOGGER.info("Database updated and {} row(s) got effected on schedule 1", rows);
}
}
Способ, которым я тестирую, использует часть LoadTest в пользовательском интерфейсе SOAP со следующей конфигурацией: Threads:100 Strategy: Simple, Test Delay 0, Random: 0.5 Limit: 60 seconds.
Но я все еще не могу вызвать это исключение, как я тестирую?
PS.Если я добавлю @Transactional
к dbtest()
методу, это исключение все еще будет существовать?