Приложение использует фиксированный пул потоков для параллельной обработки ссылок.
Проблема: Когда я использую реализацию SQL, все работает отлично. Однако когда я переключаюсь на реализацию JPA, во время параллельного выполнения постоянно получаю следующую ошибку:
Код: Выделить всё
A problem occurred in the SQL executor : Error advancing (next) ResultSet position [This ResultSet is closed.]Java
Код: Выделить всё
@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 закрыт»?