Это плохая практика для переключения потоков в транзакции? - PullRequest
0 голосов
/ 16 ноября 2018

Интересно, если переключение потоков внутри транзакции просто вызывает проблемы?

Поскольку следующий код блокирует один поток и делает что-то в других потоках, это кажется пустой тратой, должен быть лучший способ, чем этот,Любые советы или идеи приветствуются.Заранее спасибо.

Я пытаюсь загрузить что-то из базы данных и сохранить его после внесения некоторых изменений:

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();
}
  1. openTx / closeTx () являются простыми обертками PlatformTransactionManager, и.block () используется, чтобы удерживать этот поток от других транзакций, могут ли они работать правильно?
  2. Mono <> используется для переключения потоков, что ограничивает одновременные вызовы JpaRepository данных Spring, что может быть лучшим способом сделатьlimit?

Обновление:

Хотя код может быть более обычным, если он выполняется в одном потоке синхронно, при большом количестве таких потоков может возникнуть проблема.

Допустим, 1000 потоков выполняют все задания в своем собственном потоке, они могут вызвать высокие нагрузки на процессор.

Вместо этого, если мы разгрузим задания на ограниченные потоки, оставив эти 1000 потоков в ожидании какого-либо результата, конфликт процессора долженбыть меньше.

Итак, я мог бы предпочесть исходный код танцевального потока, если транзакция работает хорошо в этом.

1 Ответ

0 голосов
/ 16 ноября 2018

Отвечая на ваш вопрос, да, это плохая практика для переключения потоков внутри транзакции.Однако ваш код, похоже, этого не делает, он просто использует нетрадиционный способ блокировки общего ресурса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...