Метод репозитория Spring, который возвращает поток Java 8, не закрывает соединение JDBC
у меня есть Spring data
репозитория:
@Repository
interface SomeRepository extends CrudRepository<Entity, Long> {
Stream<Entity> streamBySmth(String userId);
}
Я вызываю этот метод в каком-то весеннем Бобе:
@Scheduled(fixedRate = 10000)
private void someMethod(){
someRepository.streamBySmth("smth").forEach(this::callSomeMethod);
}
Я использую базу данных MySQL. И когда я запускаю приложение после некоторых успешных вызовов методов, оно выдает исключение:
o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 08001
o.h.engine.jdbc.spi.SqlExceptionHelper : Could not create connection to database server.
o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task.
org.springframework.dao.DataAccessResourceFailureException: Unable to acquire JDBC Connection; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
кажется, что соединение не было закрыто должным образом к весне. Если я изменил метод return value на List
С Stream
он работает правильно.
обновление: Весна Загрузки версия 1.4.1.Отпустите
1 ответов
как в справочной документации четко указано, Stream
s необходимо использовать с блоком try-with-resources.
кроме того, убедитесь, что вы держите транзакцию (только для чтения) открытой на время потребления потока, аннотируя окружающий метод с помощью @Transactional
. В противном случае применяются настройки по умолчанию, и при возврате метода репозитория предпринимается попытка освободить ресурсы.
@Transactional
public void someMethod() {
try (Stream<User> stream = repository.findAllByCustomQueryAndStream()) {
stream.forEach(…);
}
}