MySQL批量插入 - 崩溃与OutOfMemory异常

时间:2013-05-02 17:47:55

标签: java mysql jdbc batch-processing

我正在尝试使用Batch Insert将两百万行插入MySQL表中。以下是我的代码。

   public void addItems(List<Item> Items) {
    try {
        conn = getConnection();
        st = conn.prepareStatement(insertStatement);
        for (Item item : items) {
            int index = 1;
            st.setString(index++, item.getA());
            st.setString(index++, item.getB());
            st.setLong(index++, item.getC());
            st.setInt(index++, item.getD());
            st.setFloat(index++, item.getE());
            st.setInt(index++, item.getF());
            st.setString(index++, item.getG());
            st.setString(index++, item.getH());
            st.addBatch();
        }
        st.executeBatch();
        st.clearBatch();
     }
   }

我多次(顺序)调用此addItems()函数,每次调用时传递的项目不超过100个。我观察到的是这个addItems()调用成功返回并通过顺序调用addItems()处理越来越多的数据(实际上是所有200万行),最后我的程序崩溃了{{1虽然我发现在Java处理的200万行中只有100行插入。我还将OutOfMemoryException设置为true。

其他感兴趣的参数 -

MySQL

  

buffer_pool_size =默认值(128 MB)   log_file_size =默认值(5 MB)

     

数据库连接字符串“jdbc:mysql:// host:port / database?useServerPrepStmts = false&amp; rewriteBatchedStatements = true”;

我已经为Java进程分配了512MB。

最大连接数:10 最小连接数:1

问题 -

  1. preparedStatement.executeBatch()调用是否异步    操作或MySQL连接器之前是否缓冲这些调用    把它发送到数据库?
  2. 如何确保首先提交100行然后处理    下一组行?
  3. 增加buffer_pool_size和log_file_size是否有助于更快插入?    我无法访问数据库主机,所以还没有尝试过。    当我有权访问时,我会尝试这个。
  4. 如何解决这个问题? - 因此我无法进一步发展。

1 个答案:

答案 0 :(得分:0)

1.你可以总是看代码来计算这样的东西。查看源代码here,第1443-1447行似乎就是答案 - 它取决于。例如,版本,或者批量大小大于3(否则不值得付出努力)。

4.我在类似情况下做的是在每个X行之后执行批处理(比方说,100)。