使用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() }
关键说明
- 直接在
sql""模板中使用SQLSyntax对象传递动态表名、列名,ScalikeJDBC会正确识别这是一个可复用的预编译语句框架。 SQLSyntax.createUnsafely需确保传入的tableName和columnNames是可信来源,避免SQL注入风险。- 调整后,数据库会接收到一条预编译INSERT语句+20K组参数,真正实现批量插入,日志中只会显示一次语句执行(或数据库驱动层面的批量提交日志)。
内容的提问来源于stack exchange,提问作者user6048082
相关产品推荐
相关产品推荐

