У меня есть репозиторий Spring data
:
@Repository
interface SomeRepository extends CrudRepository<Entity, Long> {
Stream<Entity> streamBySmth(String userId);
}
Я вызываю этот метод в каком-то компоненте Spring:
@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
Кажется, это соединение не было правильно закрыто Spring. Если я изменил возвращаемое значение метода на List
с Stream
, он работает правильно.
ОБНОВЛЕНИЕ: версия Spring Boot — 1.4.1.RELEASE.
close
в потоке? - person marstran   schedule 07.12.2016Stream
вручную неправильно. - person Eduard Grinchenko   schedule 07.12.2016Stream
из репозитория, ноStream
ленив, так как иначе Spring узнает, когда закрыть соединение?Stream
также являетсяAutoClosable
, поэтому вы можете использовать его в предложении try-with-resources. - person marstran   schedule 07.12.2016Stream
s имеет завершающие операции, а это значит, что после них вы больше ничего не можете делать со Stream.forEach
— одна из таких операций. - person Eduard Grinchenko   schedule 07.12.2016