Запросы на поиск объектов в базе данных только для чтения возвращают значение null при запуске параллельными потоками с JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Запросы на поиск объектов в базе данных только для чтения возвращают значение null при запуске параллельными потоками с

Сообщение Anonymous »

У меня есть код следующего содержания:

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

// An Issue is a ticket describing a requirement, like a Jira issue or a github issue.
Stream issueStream = getIssueStreamFromDB();
Iterator issues = issueStream.iterator();

while(issues.hasNext()){

while(!batch.isFull && issues.hasNext()){
Issue issue = issues.next();
ParallelBatch batch = new ParallelBatch(batchSize);
batch.add(new FeatureMinerBean(issue, restOfArguments));
}

// execute measurements in parallel to issues in batch
batch.parallelStream().forEach(b -> doMeasurements(b));

// rest of code ...
}
Как вы можете понять из приведенного выше кода, я хочу обработать поток проблем, которые я получаю от базы данных Postgres. Получение проблем выполняется основным потоком, который собирает их пакеты для обработки рабочими потоками, предоставляемыми Java Stream API.
DoMeasurements() внутри вызывает набор методов, каждый из которых отвечает за измерение показателя. Для выполнения такой задачи некоторым методам необходимо выполнять запросы к БД.
Проблема в следующем. Если измерения выполняются основным потоком (а именно поток, возвращаемый пакетом, является последовательным), все работает. И наоборот, если я переключусь на параллельный поток, как показано в примере кода выше, все запросы к базе данных, выполняемые рабочими потоками, вернут либо нулевые значения (т. е. методы find()), либо нули (т. е. count( ) методы).
Я хотел бы прибегнуть к параллельному потоку, поскольку ожидаю, что количество проблем будет большим, а измерение метрик может оказаться довольно дорогостоящим из-за их количество и сложность.
Это намеренное поведение? Я пропустил какой-то шаг, чтобы иметь возможность доступа к базе данных из нескольких потоков?
Я использую стек Spring+Hibernate для взаимодействия с уровнем персистентности через JPA.
Я использую стек Spring+Hibernate для взаимодействия с уровнем персистентности через JPA.
Я использую стек Spring+Hibernate.
Весь приведенный выше код и метод doMeasurements() помечены @Transactional.
Я использую Java версия 17, поэтому мне не следует использовать версию API потока из Java 8.

Подробнее здесь: https://stackoverflow.com/questions/791 ... threads-us
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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