将矢量元素插入数据库FAST

时间:2013-02-13 12:38:00

标签: java sqlitejdbc

我有以下数据库:

CREATE TABLE person_bornYear (name, year INT, prob FLOAT);

我有一个包含person元素的对象(PersonYear):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元素)。

是否有人可以通过更快的方式向我提示将矢量元素插入数据库?

提前致谢。

3 个答案:

答案 0 :(得分:2)

您可以像以下示例中那样执行简单的批处理查询: http://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/

答案 1 :(得分:1)

两个快速的事情可以显着加快您的代码:

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

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

答案 2 :(得分:0)

首先,您将通过每次迭代实例化相同的预准备语句。相反,如果你在循环之前实例化它然后重新使用它,你可能会获得一些速度。

其次,因为您同时进行了大量操作,所以可以使用批量插入:Efficient way to do batch INSERTS with JDBC

这样的事情:

PreparedStatement stmt = this.get_conn().prepareStatement("...");
for (...) { 
  ... 
  stmt.addBatch();
  stmt.clearParameters();
}
stmt.executeBatch();

第三:为什么插入它们如此之快如此重要?如果软件不依赖于数据,您可以考虑使用线程进行操作。这将允许主数据库在数据库咀嚼矢量数据时继续。

根据您的数据库后端,您还可以拆分向量并在不同的线程中同时插入数据。如果你的后端有一个合适的MVCC,它可以节省你很多时间。