Saya akan memilih opsi B. Saya tidak terlalu paham dengan BatchSql
sejak terakhir saya memeriksanya, itu hanya menjalankan banyak pertanyaan secara berurutan, yang sangat lambat. Saya akan merekomendasikan menggabungkan semuanya menjadi satu kueri. Ini sedikit lebih membosankan, tetapi jauh lebih cepat untuk mengeksekusi satu kueri dengan seribu sisipan daripada seribu sisipan tunggal.
Untuk kenyamanan, katakanlah Anda memiliki Seq
dari
case class Test(val1: Int, val2: Option[Long], val3: Option[String])
Kemudian Anda dapat membuat kueri seperti ini:
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()
Catatan:
Anda harus memeriksa bahwa values
tidak kosong sebelum melanjutkan, karena akan menghasilkan pernyataan SQL yang tidak valid jika kosong.
Bergantung pada berapa banyak baris dan kolom yang Anda masukkan, pada akhirnya pengurai token yang membuat pernyataan yang disiapkan akan melambat dari jumlah token yang akan diurai (dan ukuran string). Saya perhatikan ini setelah beberapa ratus baris dengan beberapa kolom. Ini bisa sedikit dikurangi. Berkat Scala menjadi bahasa yang diketik dengan kuat, Int
dan Long
tidak menimbulkan ancaman untuk injeksi SQL. Anda dapat menyiapkan pernyataan SQL menggunakan interpolasi/penggabungan string hanya untuk kolom tersebut dan mengikat kolom yang tidak aman dengan NamedParameter
biasanya. Itu akan mengurangi jumlah token yang perlu diuraikan.