Ошибки усечения Catch

#java #database

#java #База данных

Вопрос:

У меня есть небольшое приложение со встроенной базой данных. Иногда возникают ошибки усечения при попытке вставить переменные, которые превышают максимальный размер соответствующего столбца базы данных.

Я хочу обнаружить это перед вставкой / обновлением и показать пользователю правильное сообщение.

Теперь я предполагаю, что есть две возможности для достижения этого.

  1. Получите максимальную длину интересующего столбца с помощью DatabaseMetaData объекта. Вы могли бы уменьшить нехватку производительности, используя синглтоны или аналогичные конструкции.

  2. Сохраняйте максимальную длину в коде Java (например: в ResourceBundle или Properties файле) и сверяйте с этими значениями. Недостатком, конечно, является то, что код Java и база данных должны быть синхронизированы. Это может привести к ошибкам.

Какой подход был бы наилучшим?

Комментарии:

1. Что касается проблемы «нехватки производительности»: Не оптимизируйте преждевременно. Никто не должен обновлять системные таблицы, которые имеют длины столбцов, и база данных должна кэшировать этот материал (в конце концов, база данных использует эту информацию для проверки). Если вы действительно обеспокоены, создайте тест и измерьте масштаб проблемы, прежде чем решите написать код для ее решения.

2. Похоже, вы уже намекнули себе, что вариант # 2 подвержен ошибкам. Если вам нужно, чтобы кто-то сказал вам, что вы правы, что ж… ВЫ ПРАВЫ! Я бы избегал варианта # 2, поскольку он предоставляет два авторитетных источника для одной и той же части данных, что никогда не является выигрышной ситуацией.

Ответ №1:

Единственный ответ, который не потребует обслуживания, — это получение максимальной длины интересующего столбца во время подключения к базе данных.

Если вы используете Integer.valueOf(…), вы можете сохранить это в объекте, который в любом случае возвращает меньшие значения (в соответствии с текущими спецификациями JVM) в пул одноэлементных элементов. Это устранит множество проблем с производительностью памяти, поскольку все столбцы в конечном итоге будут ссылаться на несколько уникальных значений, которые, вероятно, есть в вашей базе данных.

Кроме того, покопавшись в DatabaseMetaData, я бы поискал любые флаги, которые указывают, что столбцы будут усекаться при вставках большего размера, чем данные. Это может предоставить переключатель, позволяющий узнать, нужен ли ваш код.

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

Ответ №2:

Комбинация обоих подходов. Во время сборки приложения вы используете DatabaseMetaData для динамического создания пакета ресурсов.

Ответ №3:

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

Кроме того, используйте наименьшее максимальное значение символа, которое у вас есть, в качестве константы в коде Java. Это обрабатывает необходимость синхронизации или зависимости от базы данных, и в любом случае это более или менее произвольно. Пользователям все равно, каков максимальный размер, им просто нужно знать, каков максимальный размер, иначе они не допустят ошибки автоматически.