Код: Выделить всё
// 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 ...
}
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
Мобильная версия