Пакетные гетерогенные SQL подготовленные операторы с Groovy?
Пакетная вставка с использованием Groovy Sql? обсуждает, как выполнить несколько подготовленных операторов в пакете. Но все операторы должны иметь одинаковую структуру (передаваться как аргумент верхнего уровня withBatch
).
Есть ли способ пакетировать разнородные подготовленные заявления, такие как:
sql.withBatch {ps ->
ps.addBatch("insert into t1 values(:a, :b)", [a:1, b:2])
ps.addBatch("insert into t2 values(:c)", [c:3])
}
(Это вызывает исключение, потому что addBatch
не имеет этой подписи.)
2 ответа
Как описано в документации Oracle:
Подготовленные операторы: один и тот же оператор повторяется с разными переменными связывания.
Пакетные обновления: Вы можете уменьшить количество обращений к базе данных, тем самым улучшая производительность приложения, сгруппировав несколько операторов UPDATE, DELETE или INSERT в один пакет и получив весь пакет, отправленный в базу данных и обработанный за одну поездку. Это особенно полезно в сочетании с подготовленным заявлением.
Как описано в документации IBM и взято отсюда:
Драйверы JDBC, которые поддерживают JDBC 2.0 и выше, поддерживают пакетные обновления. С помощью пакетных обновлений вместо обновления строк таблицы DB2(R) по одной вы можете указать JDBC одновременно выполнять группу обновлений. Операторы, которые могут быть включены в один и тот же пакет обновлений, называются пакетными операторами.
Если оператор имеет входные параметры или выражения хоста, вы можете включить этот оператор только в пакет, в котором есть другие экземпляры того же оператора. Этот тип партии известен как однородная партия. Если оператор не имеет входных параметров, вы можете включить этот оператор в пакет, только если другие операторы в пакете не имеют входных параметров или выражений хоста. Этот тип партии известен как гетерогенная партия. Два оператора, которые могут быть включены в один пакет, называются пакетно-совместимыми.
Это означает, что ваш запрос невозможен. Единственное преимущество, которое вы можете получить, - это повышение производительности пакетирования операторов одного типа и подготовки только один раз:
При выполнении одного оператора SQL база данных выполняет следующие действия:
- подготовить заявление
- привязать параметры
- выполнить заявление
Когда вы используете пакетные команды, происходит следующее:
- подготовить заявление (все полученные в одной передаче)
- для всех следующих одинаковых утверждений с разными параметрами
- привязать параметры
- выполнить заявление
Так как подготовка выполняется только один раз, вы экономите время.
Но вы можете сортировать и разбивать команды:
sql.withBatch(20, "insert into t1 values(:a, :b)") {
...
}
sql.withBatch(20, "insert into t2 values(:c)") {
...
}
Кстати, что будет компилировать
sql.withBatch {ps ->
ps.addBatch("insert into t1 values(1, 2)")
ps.addBatch("insert into t2 values(3)")
}
Но в этом случае мне любопытно, что произойдет: я ожидаю, что драйвер JDBC просто не будет использовать пакетную обработку.
В этом примере рассмотрим написание хранимой процедуры для вашей базы данных ( docs), которая принимает три параметра и вставляет обе записи. Ваша заявка может вызвать процедуру с одним подготовленным оператором, и оператор может быть пакетным.