使用批量插入向数据库插入大量数据

时间:2014-12-18 08:41:47

标签: java mysql database sql-insert batch-insert

我创建了一个向MySql数据库插入数百万个值的程序。 我读到了批量插入,它将优化我的程序并使其更快,但当我尝试这样做时,它以相同的方式工作。 我没有将每个值插入数据库,而是每次500个值保存在列表中,然后将它们插入一个大循环中,如下所示:

for(int i=0;i<500;i++)
{
   insertData(list.get(i));
}

然后我删除列表中的所有值并再次开始收集500个值。 它不是更好吗?
我的插入代码是:

public void insertToNameTable(String id,String name) throws SQLException
       {
           PreparedStatement ps=null;

            ps= conn.prepareStatement("INSERT INTO NameTable values(?,?,?)",user.getId(),user.getName());


            ps.setString(1,id);
            ps.setString(2,name);
            ps.setBoolean(3,false);
            ps.executeUpdate();

       }

我有一些问题:
1.为什么批量插入时工作速度不快? 2.每次我应该输入多少值才能使它更快?(500,1000,10000)输入的值越多越好?
3.我将数据库插入数据库的方式是最好的方法吗?

2 个答案:

答案 0 :(得分:2)

这是批量插入的有效方法。

Connection connection = new getConnection();
Statement statement = connection.createStatement();
 
for (String query : queries) {
    statement.addBatch(query);
}
statement.executeBatch();
statement.close();
connection.close();

答案 1 :(得分:0)

问题1&amp; 2:

前一天用户Neil Coffey说:

  

准备好的陈述主要是关于表现的概念是一种误解,虽然它是一种常见的陈述。

     

另一张海报提到他注意到Oracle和SQL Server的速度提升了大约20%。我注意到与MySQL类似的数字。事实证明,解析查询并不是所涉及工作的重要部分。在一个非常繁忙的数据库系统上,它还不清楚查询解析是否会影响整体吞吐量:总的来说,它可能只是耗尽CPU时间,否则当数据从磁盘返回时它将处于空闲状态

     

因此,作为使用预准备语句的一个原因,针对SQL注入攻击的保护远远超过了性能改进。如果您不担心SQL注入攻击,您可能应该......

这是原帖:
PreparedStatements and performance
在我看来,所有答案都值得一读。我认为你希望PreparedStatement成为某种魔术师会大大提高你的插入速度,这就是你对你所获得的改进感到失望的原因。

问题3
使用PreparedStatement的正确方法是准备一个语句,然后设置值并在循环中更新数据库。这是一个很好的例子:Reusing a PreparedStatement multiple times