Java 将矢量元素快速插入数据库

Java 将矢量元素快速插入数据库,java,sqlitejdbc,Java,Sqlitejdbc,我有以下数据库: CREATE TABLE person_bornYear (name, year INT, prob FLOAT); 我有一个带有object(PersonYear)的向量,它包含person元素:String name,int year,double prob 我尝试将矢量元素逐行插入数据库: private Statement _stat; private Connection _conn; private PreparedStatement _prep; for (Pe

我有以下数据库:

CREATE TABLE person_bornYear (name, year INT, prob FLOAT);
我有一个带有object(PersonYear)的向量,它包含person元素:String name,int year,double prob

我尝试将矢量元素逐行插入数据库:

private Statement _stat;
private Connection _conn;
private PreparedStatement _prep;
for (PersonYear py : vecToInsert) {
    this.set_prep(this.get_conn().prepareStatement("INSERT into person_bornYear values (?, ?, ?);"));
    this.get_prep().setString(1, py.get_person());
    this.get_prep().setString(2, Integer.toString(py.get_year()));
    this.get_prep().setString(3, Double.toString(py.get_accuracy()));
    this.get_prep().executeUpdate();
}
它需要2-3分钟(向量包含100K个元素)

有人能给我一个更快的方法把矢量元素插入数据库吗


提前感谢。

两件可以显著加快代码速度的简单事情:

  • 不要为每次迭代重新创建准备好的语句。这是一个相当昂贵的操作,而且您得到的对象是可重用的
  • 您可以对准备好的语句批处理多个调用,以减少对数据库的调用次数
  • 此代码未经测试,请根据需要进行修改:

    this.set_prep(this.get_conn().prepareStatement("INSERT into person_bornYear values (?, ?, ?);"));
    for (PersonYear py : vecToInsert) {
        this.get_prep().setString(1, py.get_person());
        this.get_prep().setString(2, Integer.toString(py.get_year()));
        this.get_prep().setString(3, Double.toString(py.get_accuracy()));
        this.get_prep().addBatch();
    }
    
    this.get_prep.executeBatch();
    

    首先,在每次迭代中都要实例化相同的准备好的语句。相反,如果在循环之前实例化它,然后重用它,您可能会获得一些速度

    第二,由于您同时执行一系列操作,因此可以使用批量插入:

    大概是这样的:

    PreparedStatement stmt = this.get_conn().prepareStatement("...");
    for (...) { 
      ... 
      stmt.addBatch();
      stmt.clearParameters();
    }
    stmt.executeBatch();
    
    第三:为什么这么快插入它们如此重要?如果软件不依赖于数据,你可以考虑用线程来做。这将允许主应用程序在数据库处理矢量数据时继续运行


    根据您的数据库后端,您还可以拆分向量并在不同的线程中同时插入数据。如果您的后端有一个合适的批处理程序,它将为您节省大量时间。

    您可以执行一个简单的批处理查询,如以下示例所示: