Java 使用线程插入记录的最佳实践?
我想用超过5亿行填充数据库表,我有下面的Java 使用线程插入记录的最佳实践?,java,multithreading,sqlite,jdbc,executorservice,Java,Multithreading,Sqlite,Jdbc,Executorservice,我想用超过5亿行填充数据库表,我有下面的insert方法: public void insertRecord(Record rec) throws SQLException, ClassNotFoundException { if (this.isTableExists(this.TABLE_NAME)) { Connection conn = this.getConnection(); conn.setAutoCommit(true);
insert
方法:
public void insertRecord(Record rec) throws SQLException, ClassNotFoundException {
if (this.isTableExists(this.TABLE_NAME)) {
Connection conn = this.getConnection();
conn.setAutoCommit(true);
PreparedStatement ps = conn.prepareStatement("insert into "+this.TABLE_NAME+" ("+this.NODE_ID_COL+", "+this.LAT_COL+", "+this.LNG_COL+", "+this.XML_PATH_COL+") values (?, ?, ?, ?)");
ps.setString(1, rec.getNodeID());
ps.setString(2, rec.getLat());
ps.setString(3, rec.getLng());
ps.setString(4, rec.getPath());
ps.addBatch();
ps.executeBatch();
ps.close();
conn.close();
} else {
Log.e(TAG, "insertRecord", "table: ["+this.TABLE_NAME+"] does not exist");
}
}
我的问题是,因为我将插入大量行:
你的方法效率很低。 对于每一张你想要的唱片
PreparedStatement
PreparedStatement
,并在其上执行大小为50-100的批处理
之后,如果你知道自己在做什么,你可以考虑多线程。多线程并不是让一切都变得更快的魔法。
在插入方法中,保留一个记录数组作为缓冲区 达到100项后,创建一个PreparedStatement
,然后为每条记录调用addBatch
。添加所有记录后,调用executeBatch
这将返回一个数组,其中包含每个批处理调用的受影响记录的位置
如果这还不够,那么是的,您应该查看队列中运行Runnables
的executor
,它们中的每一个都是一个插入(甚至是一批插入)
问题是,错误处理变得越来越复杂,因此,如果可以,请尽量避免它
另外,使用多线程意味着执行是异步的,因此如果客户端正在等待响应,则需要小心地进行同步。无需为每100项重新创建一条准备好的语句。如果批处理大小为100,并且我要插入102条记录,例如,我应该如何处理其余的2条记录?或者换句话说,如果我不知道要提前插入多少条记录,我该如何处理这种情况?请给出建议?在执行结束时,如果缓冲区不为空,“刷新”它,则在数组上等待对wathever执行foreach。如果这是一个永远运行的守护进程,请设置一个超时:在缓冲区满时或n秒后刷新缓冲区。如果批量大小为100,并且我想插入102条记录,我应该如何处理其余的2条记录?例如??请提供建议?我的意思是,我不知道我想提前插入多少条记录,我怎么处理这件事请告诉我你不需要知道。只需插入您获得的所有记录,至少每100次插入执行一次批处理。当项目少于100个时,没有什么可以阻止您在最后执行较小的批处理。