Метод репозитория 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 ответов


как в справочной документации четко указано, Streams необходимо использовать с блоком try-with-resources.

кроме того, убедитесь, что вы держите транзакцию (только для чтения) открытой на время потребления потока, аннотируя окружающий метод с помощью @Transactional. В противном случае применяются настройки по умолчанию, и при возврате метода репозитория предпринимается попытка освободить ресурсы.

@Transactional
public void someMethod() {

  try (Stream<User> stream = repository.findAllByCustomQueryAndStream()) {
    stream.forEach(…);
  } 
}