将1000行插入到一个表(jdbc/连接器-mysql数据库)中的最佳/最省时的方法是什么?(它是一个缓冲区,每次满了都需要转储到数据库中)
1-一条自动生成/合并的SQL语句?
2- for (int i = 0; i<1000; i++) { con.prepareStatement(s.get(i)); } con.commit();
3-存储过程?
4-通过文件进行批量数据插入?
5- (您的解决方案)
发布于 2010-08-09 02:24:47
The LOAD DATA INFILE statement可能是您获得性能的最佳选择。(上面选项列表中的#4)尽管它可能需要更多的代码来完成任务,因为您需要创建中间文件,将其获取到服务器,然后调用LOAD DATA将其加载到数据库中。
MySql帮助页面引用:
LOAD DATA INFILE语句以极高的速度将文本文件中的行读入表中。
发布于 2010-08-09 02:22:06
您可以使用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配置中。
如果您想创建一个大的MySQL字符串,还可以使用特定于SQL的批插入语法。我会尝试这两种方法,并测试性能。
INSERT INTO x (a,b)
VALUES ('1', 'one'),
('2', 'two'),
('3', 'three');对于这两种方法都要小心,因为您可能会超过单个请求的最大数据包大小。您可能需要设置与缓冲区中的条目数量不同的批处理大小。例如,您可能需要将1000个条目分成10个批次,每批100个。
发布于 2010-08-09 03:19:00
请注意,JDBC会在每条语句之后自动提交,除非您显式地告诉它不要这样做。这样做,并在运行提交之前运行X插入,应该会大大提高您的性能。
https://stackoverflow.com/questions/3435467
复制相似问题