2013-03-13 4 views
3

Мой вопрос очень прост и в названии. Google и переполнение стека не дают мне ничего, поэтому я решил, что пришло время задать вопрос.Несколько подготовленных заявлений или пакет

Я в настоящее время находится в процессе создания запроса sql, когда пользователи регистрируются на моем сайте. Я ВСЕГДА использовал только подготовленные операторы b/c для дополнительного кодирования в вызываемых операторах, а результат выполнения регулярных операторов отключается. Однако этот запрос заставляет меня думать о возможных альтернативах моему предыдущему одному размеру для всех (подготовленных заявлений) способов.

Этот запрос имеет в общей сложности 4 круглых поездки в базу данных. Этапы:

  1. Вставьте пользователя в базу данных, верните сгенерированный ключ (их идентификатор пользователя) в результирующий набор.
  2. Возьмите идентификатор пользователя и вставьте строку в таблицу альбомов. Возврат сгенерированного ключа (id альбома)
  3. Возьмите идентификатор альбома и вставьте строку в таблицу изображений. Вернитесь сгенерированным ключом (ID изображения)
  4. Возьмите идентификатор изображения и обновить пользовательские таблицы столбец текущего по умолчанию с ID изображения

сторона: Для тех, кто заинтересован в том, как я получаю ключи обратно после моих вставок это с Statement.RETURN_GENERATED_KEYS, и вы можете прочитать отличную статью об этом здесь. IBM Article

Так или иначе, я хотел бы знать, подходит ли использование подготовленных заявлений на 4 раунда (но кэшируемых), или если я должен идти с пакетными (но не кэшируемыми) утверждениями?

ответ

2

JQBC-пакетные операторы позволяют сократить количество обращений в тегах при условии, что между строками, которые вы вставляете или обновляете, нет зависимости от данных. Ваш сценарий не подходит для этого условия, поскольку изменения зависят от данных друг друга: заявления с 2 по 4 должны получить идентификатор из предыдущего заявления с 1 по 3.

С другой стороны, четыре круглых поездки, безусловно, неоптимальные. Вот почему сценарии, подобные вашим, требуют хранимых процедур: вы можете поместить всю эту логику в create_user_proc и вернуть идентификатор пользователя обратно вызывающему абоненту. Все вставки от 1 до 4 будут происходить внутри вашего кода SQL, позволяя вам управлять зависимостями ID в SQL. Вы могли бы вызвать эту хранимую процедуру в одном кругообороте, что определенно быстрее, особенно если вы обрабатываете несколько пользовательских регистраций в минуту.

+0

спасибо. Я отвечу на ваш совет. У вас есть ссылка, где я могу получить некоторые инструкции о том, что вы говорите мне делать? Особенно, как получить сгенерированный ключ и перейти к следующей таблице? Я использую mysql. – gmustudent

+0

И вы должны всегда использовать хранимые процедуры с чисто служебной точки зрения? Разве это не всегда было бы быстрее, чем готовые заявления или регулярные заявления? – gmustudent

+0

@gmustudent Вы можете узнать о хранимых процедурах в MySQL, посмотрев обучающие материалы [здесь] (http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx). Синтаксис не такой сложный - в вашем случае у вас будет четыре вставки и используйте ['last_inserted_id()'] (http://dev.mysql.com/doc/refman/5.0/en/information-functions. html # function_last-insert-id). – dasblinkenlight

1

Я бы посоветовал написать один ХП делать всю эту четыре операции и передавая все необходимые параметры из приложения (к хранимой процедуре) сразу и там, хранимой процедура, вы можете получить ключи для результирующего

+0

Спасибо за совет – gmustudent

1

Чтобы увеличить производительность и сократить количество поездок по базам данных, я согласен с dasblinkenlight и ajduke - хранимые процедуры достигнут этого.

Но это действительно узкое место в вашем приложении?

  • Как зарегистрироваться на сайте?
  • Сравните это с тем, как часто информация читает из этих таблиц (один раз на страницу доступа?)

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

Почему вы не можете использовать хранимые процедуры и придерживаться подготовленных заявлений:

  • не как портативные, как с помощью подготовленных инструкций (другой синтаксиса/языка для каждой базы данных, некоторые простые базы данных не поддерживают даже их)
  • не будет работать с решениями ORM, такими как JPA * - вы упомянули использование PreparedStatements напрямую, поэтому это, вероятно, не относится к вам, по крайней мере, сейчас, но это может ограничивать вас позже, если вы захотите использовать ORM в будущем

* JPA 2.1 может на самом деле support stored procedures, но с момента его написания он еще не выпущен.

+0

Отличная отличная информация. спасибо – gmustudent

Смежные вопросы