Java 使用线程插入记录的最佳实践?

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);

我想用超过5亿行填充数据库表,我有下面的
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");
    }

}
我的问题是,因为我将插入大量行:

  • 我应该在上面发布的方法中使用线程吗
  • 对于这种情况,最佳做法是什么
  • 在这种情况下,Executor服务是否会产生更好的性能

  • 你的方法效率很低。 对于每一张你想要的唱片

  • 获取新连接(如果您有连接池,这不是 (问题)
  • 准备一份新的
    PreparedStatement
  • 创建大小为1的批
  • 立即执行批处理
  • 相反,您应该保留一个
    PreparedStatement
    ,并在其上执行大小为50-100的批处理


    之后,如果你知道自己在做什么,你可以考虑多线程。多线程并不是让一切都变得更快的魔法。

    在插入方法中,保留一个记录数组作为缓冲区

    达到100项后,创建一个
    PreparedStatement
    ,然后为每条记录调用
    addBatch
    。添加所有记录后,调用
    executeBatch

    这将返回一个数组,其中包含每个批处理调用的受影响记录的位置

    如果这还不够,那么是的,您应该查看队列中运行
    Runnables
    executor
    ,它们中的每一个都是一个插入(甚至是一批插入)

    问题是,错误处理变得越来越复杂,因此,如果可以,请尽量避免它


    另外,使用多线程意味着执行是异步的,因此如果客户端正在等待响应,则需要小心地进行同步。

    无需为每100项重新创建一条准备好的语句。如果批处理大小为100,并且我要插入102条记录,例如,我应该如何处理其余的2条记录?或者换句话说,如果我不知道要提前插入多少条记录,我该如何处理这种情况?请给出建议?在执行结束时,如果缓冲区不为空,“刷新”它,则在数组上等待对wathever执行foreach。如果这是一个永远运行的守护进程,请设置一个超时:在缓冲区满时或n秒后刷新缓冲区。如果批量大小为100,并且我想插入102条记录,我应该如何处理其余的2条记录?例如??请提供建议?我的意思是,我不知道我想提前插入多少条记录,我怎么处理这件事请告诉我你不需要知道。只需插入您获得的所有记录,至少每100次插入执行一次批处理。当项目少于100个时,没有什么可以阻止您在最后执行较小的批处理。