मैं विकल्प बी के साथ जाऊंगा। मैं 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 कथन उत्पन्न करता।
आप कितनी पंक्तियों और स्तंभों को सम्मिलित कर रहे हैं, इस पर निर्भर करते हुए, अंततः टोकन पार्सर्स जिन्होंने तैयार कथन बनाया है, टोकन की भारी मात्रा से पार्स (और स्ट्रिंग आकार) तक धीमा हो जाएगा। मैंने इसे कई स्तंभों के साथ कुछ सौ पंक्तियों के बाद देखा है। इसे कुछ हद तक कम किया जा सकता है। स्काला के दृढ़ता से टाइप की जाने वाली भाषा होने के लिए धन्यवाद, Int
और Long
SQL इंजेक्शन के लिए कोई खतरा नहीं है। आप केवल उन कॉलम के लिए स्ट्रिंग इंटरपोलेशन/कॉन्सटेनेशन का उपयोग करके अपने एसक्यूएल स्टेटमेंट तैयार कर सकते हैं और असुरक्षित कॉलम को NamedParameter
से बांध सकते हैं। सामान्य रूप से। इससे पार्स किए जाने वाले टोकन की संख्या कम हो जाएगी।