Почему JPA getResultStream() выдает «ResultSet закрыт» в многопоточной службе Spring, в то время как JdbcTemplate работаJAVA

Программисты JAVA общаются здесь
Anonymous
Почему JPA getResultStream() выдает «ResultSet закрыт» в многопоточной службе Spring, в то время как JdbcTemplate работа

Сообщение Anonymous »

Я разрабатываю приложение Spring Boot 3 (Java 25), которое периодически проверяет наличие обновлений от внешних API (GitHub/StackOverflow). У меня есть две реализации репозитория: одна с использованием JdbcTemplate (SQL), а другая с использованием EntityManager (JPA/ORM).
Приложение использует фиксированный пул потоков для параллельной обработки ссылок.
Проблема: Когда я использую реализацию SQL, все работает отлично. Однако при переключении на реализацию JPA я постоянно получаю следующую ошибку во время параллельного выполнения:

Проблема в исполнителе SQL: Ошибка продвижения (следующей) позиции набора результатов [Этот набор результатов закрыт.]

Метод моего репозитория JPA:

Код: Выделить всё

@Override
public OffsetDateTime getUpdatedAtByUrl(String url) {
String query = "select l.lastUpdatedAt from Link l where l.url = :url";
return entityManager
.createQuery(query, OffsetDateTime.class)
.setParameter("url", url)
.getResultStream()
.findFirst()
.orElse(null);
}
Логика моей службы:

Код: Выделить всё

ExecutorService executor = Executors.newFixedThreadPool(threadCount);
for (LinkResponse link : links) {
executor.submit(() -> processLink(link)); // Calls the repository inside
}
Если я заменю .getResultStream().findFirst() на .getResultList().stream().findFirst(), ошибка исчезнет.
Мои вопросы:
  • Почему getResultStream() сохраняет ResultSet открытым, что приводит к конфликтам в многопоточная среда, даже если потоки предположительно независимы?
  • Известно ли это ограничение поддержки Hibernate Stream в сочетании с управлением транзакциями Spring и ExecutorService?
  • Каков рекомендуемый способ получения одного необязательного значения в JPA, чтобы избежать состояния гонки «ResultSet закрыт»?

Вернуться в «JAVA»