Ще отида с опция Б. Не съм много запознат с BatchSql
тъй като последно проверих, той просто изпълнява последователно зареждане от заявки, което е ужасно бавно. Бих препоръчал да обедините всичко в една заявка. Малко по-досадно, но много по-бързо е да изпълните една заявка с хиляда вмъквания, отколкото хиляда единични вмъквания.
За удобство да приемем, че имате Seq
от
case class Test(val1: Int, val2: Option[Long], val3: Option[String])
След това можете да създадете вашата заявка по следния начин:
val values: Seq[Test] = Seq(....)
/* Index your sequence for later, to map to inserts and parameters alike */
val indexedValues = values.zipWithIndex
/* Create the portion of the insert statement with placeholders, each with a unique index */
val rows = indexValues.map{ case (value, i) =>
s"({val1_${i}}, {val2_${i}}, {val3_${i}})"
}.mkString(",")
/* Create the NamedParameters for each `value` in the sequence, each with their unique index in the token, and flatten them together */
val parameters = indexedValues.flatMap{ case(value, i) =>
Seq(
NamedParameter(s"val1_${i}" -> value.val1),
NamedParameter(s"val2_${i}" -> value.val2),
NamedParameter(s"val3_${i}" -> value.val3)
)
}
/* Execute the insert statement, applying the aggregated parameters */
SQL("INSERT INTO table1 (col1, col2, col3) VALUES " + rows)
.on(parameters: _ *)
.executeInsert()
Бележки:
Ще трябва да проверите тези values
не е празен, преди да продължи, тъй като би генерирал невалиден SQL оператор, ако беше.
В зависимост от това колко реда и колони вмъквате, в крайна сметка анализаторите на токени, които са създали подготвения израз, ще се забавят от огромното количество токени за анализ (и размера на низа). Забелязах това след няколкостотин реда с няколко колони. Това може да бъде смекчено донякъде. Благодарение на това, че Scala е строго типизиран език, Int
и Long
не представлява заплаха за SQL инжектиране. Можете да подготвите вашите SQL изрази, като използвате интерполация/конкатенация на низове само за тези колони и да свържете опасните колони с NamedParameter
нормално. Това ще намали броя на токените, които трябва да бъдат анализирани.