You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ScalikeJDBC Batch API批量插入20K行却执行20K次单条插入的问题

ScalikeJDBC批量插入执行多次的问题修复

你的问题出在SQL语句的构造方式导致ScalikeJDBC无法识别批量操作的预编译模板,进而将每条数据都当作独立语句执行。

问题原因

你先通过SQLSyntax.createUnsafely拼接出完整的INSERT SQL字符串,再将其嵌入sql""模板中。这种写法会让ScalikeJDBC无法复用预编译语句,只能为每条参数单独执行一次INSERT,最终出现20K次语句执行的日志。

正确写法

直接在sql""模板中动态拼接表名与列名,让ScalikeJDBC生成可批量复用的预编译语句:

DB.localTx { implicit session =>
  val batchParams: Seq[Seq[Any]] = data
  // 用SQLSyntax安全处理动态列名与表名
  val columnSyntaxList = SQLSyntax.csv(columnNames.map(SQLSyntax.createUnsafely))
  val tableSyntax = SQLSyntax.createUnsafely(tableName)
  // 生成占位符字符串
  val placeholders = columnNames.map(_ => "?").mkString(",")

  sql"insert into $tableSyntax ($columnSyntaxList) values ($placeholders)"
    .batch(batchParams: _*)
    .apply()
}

关键说明

  1. 直接在sql""模板中使用SQLSyntax对象传递动态表名、列名,ScalikeJDBC会正确识别这是一个可复用的预编译语句框架。
  2. SQLSyntax.createUnsafely需确保传入的tableName和columnNames是可信来源,避免SQL注入风险。
  3. 调整后,数据库会接收到一条预编译INSERT语句+20K组参数,真正实现批量插入,日志中只会显示一次语句执行(或数据库驱动层面的批量提交日志)。

内容的提问来源于stack exchange,提问作者user6048082

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 16:12:08