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