У меня есть контроллер начальной загрузки, и я тестирую поведение соединений Hikari при использовании с аннотацией @Transactional.
Ниже представлен контроллер
@GetMapping("/loadTest")
public String test() {
System.out.println("in load test "+ Thread.currentThread().getName());
System.out.println("Hikari Active in controller" + new HikariDataSourcePoolMetadata(dataSource).getActive());
String ret = this.loadTestService.testLoad();
System.out.println("Hikari Active in controller after" + new HikariDataSourcePoolMetadata(dataSource).getActive());
return ret;
}
И транзакционный сервис
@Transactional
public String testLoad(){
System.out.println("Hikari Active in test load service " + new HikariDataSourcePoolMetadata(dataSource).getActive() +" " + Thread.currentThread().getName());
return "test";
}
Приведенный выше код печатается следующим образом:
Hikari Active in contoller 0
Hikari Active in test load service 1
Hikari Active in contoller after 1 // I was expecting the value to be 0 at this point
Я немного запутался здесь, я ожидаю, что метод обслуживания будет транзакционным, поэтому транзакция должна быть закрыта после возврата службы метод. Когда я запускаю код в режиме отладки, я вижу Не закрывает предварительно связанный JPA EntityManager после транзакции . Я не мог понять, почему. Спасибо.