2013-02-13 13 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