2010-08-08 65 views
5

将1000行插入到一个表(jdbc/connector-mysql数据库)中的最佳/最省时的方法是什么? (它是一个缓冲区,每当它已满时需要转储到数据库中)高效多个SQL插入

1-一个自动生成/连接的SQL语句?

2- for (int i = 0; i<1000; i++) { con.prepareStatement(s.get(i)); } con.commit();

3-存储过程?

4-批量数据通过文件插入?

5-(您的解决方案)

回答

2

The LOAD DATA INFILE statement可能是您的最佳性能表现。 (上面的选项列表中的#4)虽然它可能需要更多的代码才能完成您的任务,因为您需要创建中间文件,将其获取到服务器,然后调用LOAD DATA将其加载到数据库中。

MySQL的帮助页面引用:

的LOAD DATA INFILE语句从一个文本文件 行成 非常高的速度表。

+0

请谨慎使用此方法。我已经看到过去做过这些的系统,创建中间文件并将其发送到服务器的成本已经超过了使用快速文件加载操作的性能优势。 – 2010-08-09 07:26:40

+0

它看起来非常危险,因为我们有两个应用服务器同时访问同一个数据库。我真的害怕这个答案出现。 谢谢你的回复。 – 2010-08-10 12:00:36

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配置。

还有一个MySQL特定的批量插入语法,如果您想创建一个大的SQL字符串,您可以使用它。我会尝试并测试性能。

INSERT INTO x (a,b) 
    VALUES ('1', 'one'), 
      ('2', 'two'), 
      ('3', 'three'); 

请注意两种方法,因为您可能会超过单个请求的最大数据包大小。您可能需要设置与缓冲区中的条目数不同的批量大小。例如。您可能需要将10个批次的1000个条目分为100个。

0

请注意,JDBC在每个语句后自动提交,除非您明确地告诉它不要。这样做并在运行提交之前运行X插入,应该会提高您的性能。

+0

我忘了写我正在使用c3p0。所以我必须在最后提交。 – 2010-08-10 21:06:21