Проблема параллелизма в простом Java сервисе - PullRequest
0 голосов
/ 29 января 2020
  1. В приведенном ниже Java ToolHireService как оптимально предотвратить проблему параллелизма, когда один и тот же инструмент может быть нанят несколькими клиентами. Он должен блокировать поток только при оценке того же инструмента для найма.

  2. Есть ли какие-либо указания о том, как написать провальный тест?

public class ToolHireService {

    public int toolHire(Client client , String toolId , Date startDate , Date endDate){

        Tool tool = getToolFromDB(toolId);

        if(tool == null || tool.isHired()){
            return -1;
        }
        ToolHireEntry toolEntry = new ToolHireEntry(tool,startDate,endDate);
        client.addHireHistory(toolEntry);
        client.save();

        tool.setHired(true);
        return tool.save();

    }
}

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

1 Ответ

0 голосов
/ 30 января 2020

Ответ, как всегда, зависит от этого.

У вас есть один ToolHireInstance в одном процессе, который используют несколько клиентов? В этом случае было бы достаточно просто синхронизировать весь метод.

Есть ли у вас несколько ToolHireInstances в одном процессе, который используют несколько клиентов? В этом случае вы можете синхронизировать объект ToolHireService.class, который будет создавать один объект, который будут использоваться всеми экземплярами для синхронизации.

У вас есть несколько экземпляров ToolHireInstances, распределенных по нескольким процессам, каждый из которых имеет клиентов (и ваш база данных имеет разъем JDB C)? В этом случае вы захотите поместить sh транзакционную часть в JDB C, сделав весь метод существующим в транзакции SQL. Это потребует реорганизации вашего кода для предоставления элемента транзакции. Вам нужно решить, какой SQL уровень изоляции требуется для выполнения этого атома c pull_tool- >valu_status-> save_hiring_decision.

Есть ли у вас несколько экземпляров ToolHireInstances, распределенных по нескольким процессам, каждый из которых имеет клиентов (и нет разъем JDB C)? Проконсультируйтесь с вашей базой данных о том, какие методы транзакций существуют. Если их нет, вам нужно использовать какой-либо другой вид внешнего инструмента синхронизации.

...