У меня следующая проблема:
У меня есть многопоточное приложение на стороне сервера, где каждый запрос выполняет новый поток (стандартный случай). На основании этого запроса приложение проверяет, кэшируются ли необходимые данные уже в БД. Если да, он выбирает его и отправляет обратно клиенту. Если нет, то удаленная служба называется ответом, который сохраняется в БД и затем выбирается для возврата клиенту.
Службе требуется некоторое время для вычисления данных, и, поскольку запросы к моему приложению выполняются асинхронно, я попадаю в ловушку одного запроса, проверяющего БД, видя, что там ничего нет, затем вызываю службу. Между тем, однако, другой запрос с тем же входом будет проверять БД, и, поскольку служба занимает некоторое время, там все равно ничего не будет ... поэтому она будет инициировать еще один вызов службе. В результате данные дважды записываются в БД, что затрудняет выполнение любых успешных операций, полагаясь на их уникальность (не может быть двух записей с одинаковыми данными)
Какое решение выбрать?
Одна идея заключалась бы в том, чтобы поместить конкретные ограничения поля UNIQUE в БД. Таким образом, даже если приложение попытается написать дважды, БД просто отклонит его, и приложение сгенерирует исключение. Однако служба все равно будет выполняться несколько раз.
Другое решение, которое пришло мне в голову, - это синхронизировать метод, который вызывает веб-сервис. Таким образом, каждый последующий запрос к моему приложению будет помещен в стек ожидания до завершения предыдущей операции. Таким образом, если поступит другой запрос с теми же входными данными, в то время как первый все еще ожидает результатов от удаленного сервиса, он будет сидеть и ждать завершения операции. Затем, когда второй запрос проверяет БД, данные уже будут там, и больше не будет необходимости вызывать сервис. Это также предотвратит наличие нескольких одинаковых записей в БД. Проблема в том, что скорость моего серверного приложения неизбежно будет снижаться, потому что КАЖДЫЙ запрос придется ждать, даже те, которые обычно не должны (те, для которых, предположительно, у нас уже есть данные в БД)
Есть еще предложения? Я застрял. Как я могу реализовать какую-то условную синхронизацию?