Каждый раз, когда поступают новые данные, я проверяю базу данных, если есть запись, связанная с новыми данными, я получаю ее и обновляю запись на основе новых данных и старой записи;если записи не существует, я создам новую запись для новых данных;
Проблема: , когда несколько потоков выполняют одно и то же, естественно, образуется шаблон read -> check -> update
,в результате состояние гонки .
Я пробовал следующие решения, но оба они кажутся не совсем хорошими.
Добавить уникальное ограничение в БД для aFieldOrSeveralFields
, попытаться перехватить SQLIntegrityConstraintViolationException
и затем повторить процесс read -> check -> update
;
- Я могу поймать
Exception
, но это выглядит опасно для меня; - или я могу проверить его по
e instanceof SQLIntegrityConstraintViolationException
, и пусть всплывают другие исключения, но это выглядит некрасиво ;
Использование synchronised
в целом read -> check -> update
, но это кажется весьма неэффективным , поскольку существуют очевидные операции ввода-вывода.
Обновлено 2019-03-11
В конце, чтобы сбалансировать некрасивую обработку и эффективность , я разделил задачу на более мелкие, используя synchronised
, чтобы обеспечить согласованность данных, и до сих пор не было очевидныхпроблемы с производительностью возрастают.