将1000行插入一个表(jdbc / connector-mysql数据库)的最佳/最有效时间是什么? (它是一个缓冲区,每次填满时都需要转储到数据库中)
1-一个自动生成/同步的SQL语句?
2- for (int i = 0; i<1000; i++) { con.prepareStatement(s.get(i)); } con.commit();
3-存储过程?
通过文件插入大量数据?
5-(你的解决方案)
答案 0 :(得分:2)
The LOAD DATA INFILE statement可能是您表现最好的选择。 (上面的选项列表中的#4)虽然可能需要更多代码来完成您的任务,因为您需要创建中间文件,将其送到服务器然后调用LOAD DATA将其放入数据库。
MySql帮助页引用:
LOAD DATA INFILE语句读取 从文本文件到表中的行 速度非常快。
答案 1 :(得分:0)
您可以使用JDBC批量插入。
PreparedStatement ps = cn.prepareStatement("INSERT INTO....");
for (int i = 0; i < 1000; i++) {
ps.setString(1, "value-" + i); // Set values
ps.addBatch(); // Add this to the batch
ps.clearParameters(); // Reset the parameters
}
ps.executeBatch();
然而,MySQL本身不支持批量插入功能,因此为了获得合理的性能,您需要将rewriteBatchedStatements=true
添加到mysql jdbc配置中。
如果要创建大型SQL字符串,还可以使用MySQL特定的批处理插入语法。我会尝试两种方法并测试性能。
INSERT INTO x (a,b)
VALUES ('1', 'one'),
('2', 'two'),
('3', 'three');
请注意这两种方法,因为您可能会超过单个请求的最大数据包大小。您可能需要设置与缓冲区中的条目数不同的批处理大小。例如。您可能需要在10个批次中分割1000个条目。
答案 2 :(得分:0)
请注意,JDBC会在每个语句后自动提交,除非您明确告诉它不要。这样做并在运行commit之前运行X插入,应该会提高你的性能。