2

我有以下数据库:

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

我有一个带有对象(PersonYear)的向量,其中包含人员元素:字符串名称,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 个元素)。

有人可以提示我一种更快地将矢量元素插入数据库的方法吗?

提前致谢。

4

3 回答 3

2

您可以按照此处的示例执行简单的批处理查询: http ://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/

于 2013-03-03T16:40:36.413 回答
1

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

  1. 不要为每次迭代重新创建准备好的语句。这是一个相当昂贵的操作,并且您返回的对象是可重复使用的。
  2. 可以批量调用准备好的语句,以减少对数据库的调用次数。

此代码未经测试,根据需要修改:

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();
于 2013-02-13T12:45:06.327 回答
0

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

其次,由于您同时执行大量操作,因此您可以使用批量插入:Efficient way to do batch INSERTS with JDBC

像这样的东西:

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

第三:为什么如此快速地插入它们如此重要?如果软件不依赖于数据,你可以考虑用线程来做。这将允许主要应用程序在数据库咀嚼您的矢量数据时继续。

根据您的数据库后端,您还可以拆分向量并将数据同时插入不同的线程中。如果您的后端有适当的MVCC,它将为您节省大量时间。

于 2013-02-13T12:46:40.723 回答