【发布时间】:2018-06-01 09:07:29
【问题描述】:
我想将 originDB(sqlite3) 中的表(1000 万条记录)复制到另一个名为 targetDB 的数据库中。
我的方法的过程是:
从源表读取数据并生成ResultSet,然后为每条记录生成对应的插入sql,当记录数达到10000时执行commit批量插入。
代码如下:
public void transfer() throws IOException, SQLException {
targetDBOperate.setCommit(false);//batch insert
int count = 0;
String[] cols = parser(propertyPath);//get fields of data table
String query = "select * from " + originTable;
ResultSet rs = originDBOperate.executeQuery(query);//get origin table
String base = "insert into " + targetTable;
while(rs.next()) {
count++;
String insertSql = buildInsertSql(base,rs,cols);//corresponding insert sql
targetDBOperate.executeSql(insertSql);
if(count%10000==0) {
targetDBOperate.commit();// batch insert
}
}
targetDBOperate.closeConnection();
}
我们可以说它会越来越大,直到内存不足。 stackoverflow有一些相关的问题,例如Out of memory when inserting records in SQLite, FireDac, Delphi
,但是我没有解决我的问题,因为我们使用了不同的实现方法。
我的假设是当记录数没有达到10000时,这些相应的插入sql将被缓存在内存中并且默认执行提交时它们没有被删除?每一个建议都将不胜感激。
【问题讨论】:
-
一些建议:1) 确保将 autoCommit 设置为
false。 2)使用真正的批量更新addBatch,最重要的是确保你在insert语句中使用绑定变量(这可能是你的内存问题的原因)。