我正在尝试使用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
问题 -
答案 0 :(得分:0)
1.你可以总是看代码来计算这样的东西。查看源代码here,第1443-1447行似乎就是答案 - 它取决于。例如,版本,或者批量大小大于3(否则不值得付出努力)。
4.我在类似情况下做的是在每个X行之后执行批处理(比方说,100)。