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