Интересно, если переключение потоков внутри транзакции просто вызывает проблемы?
Поскольку следующий код блокирует один поток и делает что-то в других потоках, это кажется пустой тратой, должен быть лучший способ, чем этот,Любые советы или идеи приветствуются.Заранее спасибо.
Я пытаюсь загрузить что-то из базы данных и сохранить его после внесения некоторых изменений:
public Mono<SomeThing> updateSomething(int i) {
TransactionStatus tx = openTx();
return Mono.just(i)
.publishOn(workerThread)
.flatMap(this::loadSomethingFromDbById)
.map(Something::doSomeChange)
.flatMap(this::saveSomethingToDb)
.publishOn(Schedulers.immediate())
.doFinally(s -> closeTx(s));
}
public void blockingUpdateSomething() {
updateSomething(1).block();
}
- openTx / closeTx () являются простыми обертками PlatformTransactionManager, и.block () используется, чтобы удерживать этот поток от других транзакций, могут ли они работать правильно?
- Mono <> используется для переключения потоков, что ограничивает одновременные вызовы JpaRepository данных Spring, что может быть лучшим способом сделатьlimit?
Обновление:
Хотя код может быть более обычным, если он выполняется в одном потоке синхронно, при большом количестве таких потоков может возникнуть проблема.
Допустим, 1000 потоков выполняют все задания в своем собственном потоке, они могут вызвать высокие нагрузки на процессор.
Вместо этого, если мы разгрузим задания на ограниченные потоки, оставив эти 1000 потоков в ожидании какого-либо результата, конфликт процессора долженбыть меньше.
Итак, я мог бы предпочесть исходный код танцевального потока, если транзакция работает хорошо в этом.