【发布时间】:2010-11-07 13:40:23
【问题描述】:
我有一个应用程序可以解析日志文件并将大量数据插入数据库。它是用 Java 编写的,并通过 JDBC 与 MySQL 数据库通信。我已经尝试了不同的方法来插入数据,以便为我的特定用例找到最快的方法。目前似乎表现最好的方法是发出扩展插入(例如,具有多行的单个插入),如下所示:
INSERT INTO the_table (col1, col2, ..., colN) VALUES
(v1, v2, v3, ..., vN),
(v1, v2, v3, ..., vN),
...,
(v1, v2, v3, ..., vN);
行数可以上万。
我尝试过使用准备好的语句,但它远没有那么快,可能是因为每个插入仍然单独发送到数据库并且需要锁定表等等。在我之前编写代码的同事尝试使用批处理,但效果也不够好。
问题在于,使用扩展插入意味着据我所知,我需要自己构建 SQL 字符串(因为行数是可变的),这意味着我打开了各种 SQL 注入向量我没有足够聪明的地方找到自己。必须有更好的方法来做到这一点。
显然,我对插入的字符串进行了转义,但仅使用 str.replace("\"", "\\\""); 之类的字符串(对于 '、? 和 \ 重复),但我确信这还不够。
【问题讨论】: