Код: Выделить всё
// 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()){
ParallelBatch batch = new ParallelBatch(batchSize);
while(!batch.isFull && issues.hasNext()){
Issue issue = issues.next();
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.
РЕДАКТИРОВАТЬ:
Я нашел причину такого поведения : Заполнение данных БД и создание рабочих процессов происходят в одной транзакции. Вероятно, запросы рабочих потоков видят пустую БД, потому что сохранение данных, выполненное при заполнении БД, еще не было зафиксировано.
Я разделил код на разные транзакции, и сбой изменил внешний вид . Теперь, когда рабочие пытаются получить потоки из БД, возникает следующее исключение:
Код: Выделить всё
java.lang.IllegalStateException: Illegal pop() with non-matching JdbcValuesSourceProcessingState
Подробнее здесь: https://stackoverflow.com/questions/791 ... threads-us
Мобильная версия