Как обрабатывать пакетные вставки SQL из Spring JDBC, когда столбец таблицы слишком мал - PullRequest
0 голосов
/ 26 мая 2011

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

Поскольку набор данных очень большой (более 1 ГБ), я выполняю потоковое чтение входных данных в память. В определенные моменты я «сбрасываю» данные и пытаюсь вставить их в таблицу, используя jdbcTemplate.batchUpdate. Все столбцы таблицы назначения - это VARCHAR, и предполагается, что они имеют размер 50. Это вполне достаточно для подавляющего большинства данных. Однако, поскольку время от времени поступают данные, размер которых превышает размер 15, INSERT не будет выполнен (данные слишком длинные для столбца).

Каков наилучший подход к решению этой проблемы? Я не хочу слепо увеличивать все столбцы таблицы, поскольку это похоже на стратегию, которая не очень хорошо масштабируется. Я также предпочел бы не анализировать данные из-за их размера. Так стоит ли ждать сбоя, затем выполнить соответствующую «ALTER TABLE» и повторно отправить данные? Можно ли кэшировать сбойные элементы, определить необходимый размер столбца и повторно отправить только сбойные элементы?

Я ищу указатели и общие советы относительно оптимального способа сделать это.

Спасибо.

Ответы [ 2 ]

1 голос
/ 26 мая 2011

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

0 голосов
/ 27 мая 2011

Вы указываете, что используете колонки MySQL и varchar.Мне не ясно, будет ли текущая ширина столбца 15 или 50, но в любом случае не будет никакого снижения производительности для определения столбца varchar (255).Я предполагаю, что это позволило бы успешно завершить многие случаи сбоев.

Вы не указали, требуется ли, чтобы все данные оставались в базе данных неизмененными, или вы можете усекать или изменять данные, чтобыэто подходит.Предполагая, что вы можете изменить данные, вот несколько дополнительных соображений:

Для обработки данных, которые все еще слишком длинны, мне нравится предложение Олафа проверять данные перед их включением в пакет.Я бы проверял каждую запись по мере ее прочтения, а затем решал, добавлять ли ее в пакет вставки или обрабатывать как сбой (сохранить в файле?).

Кроме того, вы не указываете, сколько обработкивы делаете на данных после чтения и перед вставкой в ​​базу данных.Если вы этого не делаете, то, возможно, вам стоит взглянуть на инструменты массовой загрузки, доступные для MySQL (я недостаточно знаком, чтобы вам это сказать).Как правило, эти инструменты могут обрабатывать такие случаи для вас.

...