我有一个应用程序可以解析日志文件并将大量数据插入数据库。它是用 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("\"", "\\\"");
(对 '、? 和 \ 重复),但我确信这还不够。