Уникальный индекс MySQL, используемый как метод обработки исключений в Java

StackOverflow https://stackoverflow.com/questions/1025839

Вопрос

Я хочу знать, стоит ли перехватывать исключения на основе уникального индекса sql в java.

я хочу перехватить исключение типа «дубликат записи для 1-0», если да, то обработать исключение, иначе вставить правильно в таблицу базы данных?

Это было полезно?

Решение

Я говорю, что вы этого не делаете по двум причинам:

  • сообщения об ошибках немного неясны: ОШИБКА 1062 (23000):Повторяющаяся запись «xxx» для ключа 1..Вы всегда на 100% уверены, какой ключ равен 1?
  • он привязывает вас к конкретному поставщику базы данных

мне проще транзакционно:

  • проверить наличие строки;
  • выдать исключение, если строка уже существует;
  • вставьте новую строку.

Проблемы с производительностью:

Я говорю дважды отмерь, один раз отрежь.Профилируйте использование для вашего конкретного случая использования.На мой взгляд, я бы сказал, что производительность не будет проблемой, за исключением сценариев интенсивного использования БД.

Причина в том, что как только вы выполните SELECT по этой конкретной строке ее данные будут помещены в кэши базы данных и немедленно используется для проверки вставки, выполняемой по индексу для INSERT заявление.Также если принять во внимание, что этот доступ поддерживается индексом, можно прийти к выводу, что производительность не будет проблемой.

Но, как всегда, измеряйте.

Другие советы

Я не понимаю, почему нет. Это, вероятно, более эффективно, чем выполнение запроса перед вставкой. Вероятно, лучше поймать код ошибки исключения, чем распознавать сообщение об ошибке.

Вы можете использовать команду REPLACE. Он вставляет / обновляет в зависимости от наличия записи. И его атомарный тоже, тогда как запрос затем вставить / обновить нет. Это зависит от того, что вы хотите сделать, если обнаружите нарушение ключа?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top