0

我正在尝试使用 Batch Insert 将 200 万行插入到 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()调用成功返回,我通过顺序调用处理越来越多的数据(实际上是所有 200 万行)addItems(),最后我的程序崩溃了OutOfMemoryException,而我发现表中只有 100 行插入Java 已处理的 200 万行。我也设置autoCommit为true。

其他感兴趣的参数 -

MySQL

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

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

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

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

问题 -

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

1 回答 1

0

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

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

于 2013-05-02T18:19:56.293 回答