#java #database
#java #База данных
Вопрос:
У меня есть небольшое приложение со встроенной базой данных. Иногда возникают ошибки усечения при попытке вставить переменные, которые превышают максимальный размер соответствующего столбца базы данных.
Я хочу обнаружить это перед вставкой / обновлением и показать пользователю правильное сообщение.
Теперь я предполагаю, что есть две возможности для достижения этого.
-
Получите максимальную длину интересующего столбца с помощью
DatabaseMetaData
объекта. Вы могли бы уменьшить нехватку производительности, используя синглтоны или аналогичные конструкции. -
Сохраняйте максимальную длину в коде Java (например: в
ResourceBundle
илиProperties
файле) и сверяйте с этими значениями. Недостатком, конечно, является то, что код Java и база данных должны быть синхронизированы. Это может привести к ошибкам.
Какой подход был бы наилучшим?
Комментарии:
1. Что касается проблемы «нехватки производительности»: Не оптимизируйте преждевременно. Никто не должен обновлять системные таблицы, которые имеют длины столбцов, и база данных должна кэшировать этот материал (в конце концов, база данных использует эту информацию для проверки). Если вы действительно обеспокоены, создайте тест и измерьте масштаб проблемы, прежде чем решите написать код для ее решения.
2. Похоже, вы уже намекнули себе, что вариант # 2 подвержен ошибкам. Если вам нужно, чтобы кто-то сказал вам, что вы правы, что ж… ВЫ ПРАВЫ! Я бы избегал варианта # 2, поскольку он предоставляет два авторитетных источника для одной и той же части данных, что никогда не является выигрышной ситуацией.
Ответ №1:
Единственный ответ, который не потребует обслуживания, — это получение максимальной длины интересующего столбца во время подключения к базе данных.
Если вы используете Integer.valueOf(…), вы можете сохранить это в объекте, который в любом случае возвращает меньшие значения (в соответствии с текущими спецификациями JVM) в пул одноэлементных элементов. Это устранит множество проблем с производительностью памяти, поскольку все столбцы в конечном итоге будут ссылаться на несколько уникальных значений, которые, вероятно, есть в вашей базе данных.
Кроме того, покопавшись в DatabaseMetaData, я бы поискал любые флаги, которые указывают, что столбцы будут усекаться при вставках большего размера, чем данные. Это может предоставить переключатель, позволяющий узнать, нужен ли ваш код.
Помещая значения в файл свойств, вы облегчаете обнаружение проблемы, но за счет возможного нарушения их синхронизации. Такие методы эффективно являются быстрыми реализациями с небольшими первоначальными затратами, но они создают скрытые проблемы. Будет ли когда-либо возникать проблема, неизвестно, но при наличии достаточного времени могут возникнуть даже отдаленные возможности.
Ответ №2:
Комбинация обоих подходов. Во время сборки приложения вы используете DatabaseMetaData для динамического создания пакета ресурсов.
Ответ №3:
Одним из решений было бы использовать CLOB. Я не знаю, какие еще требования у вас есть к этому полю.
Кроме того, используйте наименьшее максимальное значение символа, которое у вас есть, в качестве константы в коде Java. Это обрабатывает необходимость синхронизации или зависимости от базы данных, и в любом случае это более или менее произвольно. Пользователям все равно, каков максимальный размер, им просто нужно знать, каков максимальный размер, иначе они не допустят ошибки автоматически.