Уникальный индекс MySQL, используемый как метод обработки исключений в Java
-
06-07-2019 - |
Вопрос
Я хочу знать, стоит ли перехватывать исключения на основе уникального индекса sql в java.
я хочу перехватить исключение типа «дубликат записи для 1-0», если да, то обработать исключение, иначе вставить правильно в таблицу базы данных?
Решение
Я говорю, что вы этого не делаете по двум причинам:
- сообщения об ошибках немного неясны: ОШИБКА 1062 (23000):Повторяющаяся запись «xxx» для ключа 1..Вы всегда на 100% уверены, какой ключ равен 1?
- он привязывает вас к конкретному поставщику базы данных
мне проще транзакционно:
- проверить наличие строки;
- выдать исключение, если строка уже существует;
- вставьте новую строку.
Проблемы с производительностью:
Я говорю дважды отмерь, один раз отрежь.Профилируйте использование для вашего конкретного случая использования.На мой взгляд, я бы сказал, что производительность не будет проблемой, за исключением сценариев интенсивного использования БД.
Причина в том, что как только вы выполните SELECT
по этой конкретной строке ее данные будут помещены в кэши базы данных и немедленно используется для проверки вставки, выполняемой по индексу для INSERT
заявление.Также если принять во внимание, что этот доступ поддерживается индексом, можно прийти к выводу, что производительность не будет проблемой.
Но, как всегда, измеряйте.
Другие советы
Я не понимаю, почему нет. Это, вероятно, более эффективно, чем выполнение запроса перед вставкой. Вероятно, лучше поймать код ошибки исключения, чем распознавать сообщение об ошибке.
Вы можете использовать команду REPLACE. Он вставляет / обновляет в зависимости от наличия записи. И его атомарный тоже, тогда как запрос затем вставить / обновить нет. Это зависит от того, что вы хотите сделать, если обнаружите нарушение ключа?