2013-02-13 45 views
2

我有以下数据库:插入向量元素以数据库FAST

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

而且我有对象(PersonYear),其中包含个人元素的向量:字符串名称,诠释一年,双概率。

我试图通过线插入向量元素的数据库行:

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元素)。

有人可以给我一个更快的方法来将矢量元素插入数据库吗?

在此先感谢。

回答

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

首先你通过每一次迭代实例同样准备好的声明。相反,如果您在循环之前将其实例化并重新使用它,您可能会获得一些速度。

其次,因为你是在同一时间做了一大堆的操作,您可以使用,而不是批量插入:Efficient way to do batch INSERTS with JDBC

事情是这样的:

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

第三:为什么如此重要插入他们这么快?如果软件不依赖于数据,你可以考虑用线程来完成。这可以让主应用程序在数据库咀嚼矢量数据时继续。

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

+0

嗯..你能在downvote评论? – 2013-02-17 18:01:28