2013-03-11 62 views
0

我的設置是:作爲JBoss 7.1.1和PostgreSQL插入時間過長

當沒有或者非常少的(幾百)表中的記錄,我的插入/更新完成非常快。 但是當記錄數達到幾千時,插入或更新需要很長時間。例如:插入記錄需要1秒或2秒以上。

不知道問題出在哪裏或從哪裏開始。

我的代碼更新數據庫看起來是這樣的 -

public long updateRecord(long id, List<MyData> myDataList) { 
    Event eventFromDB = findById(id).get(0); 
    List<MyData> myDataListFromDB = eventFromDB.getMyData(); 
    for(MyData myData : myDataList) { 
     myDataListFromDB.add(myData); 
    } 
    em.merge(eventFromDB); 
    return myDataList.size(); 
} 

我是一個新手,並先後成立了JBoss AS中,以我的知識。

我還沒有在JBOSS AS或PostGreSQL上進行任何配置設置。

JBOSS AS使用standalone-full.xml配置文件在獨立模式下運行。

在此先感謝。

jbossql=# \d event_mydata 
     Table "public.event_mydata" 
Column   |   Type   | Modifiers 
-----------------+------------------------+----------- 
event_id  | bigint     | not null 
date_time  | character varying(255) | 
secs_since_1970 | double precision  | 
value   | real     | 
Foreign-key constraints: 
    "fkcf2bc134ec016855" FOREIGN KEY (event_id) REFERENCES event(id) 

和列表是一個元素集合

@ElementCollection 
private List<MyData> myData; 
public List<MyData> getMyData() { 
    return myData; 
} 
+1

myDataList集合中通常有多少條記錄?您可以從eventFromDb中爲每個要添加的MyData對象檢索MyData集合。相反,您可以檢索該集合並添加所有項目。您還應該檢查包含MyData信息的表是否具有外鍵索引,以便與持有事件數據的表關聯。如果不是這樣,那就能解釋爲什麼你的方法需要很長時間才能完成。 – 2013-03-11 09:30:58

+0

通常我會說「使用PgJDBC的COPY協議支持批量加載記錄」,但我認爲你不能通過JPA真正做到這一點。你可能會通過執行'getMyData()。addAll(myDataList)'獲得更好的結果,但它仍然會執行很多小插入操作,但仍然會很慢,特別是如果你有很多往返時間數據庫和應用服務器之間。 – 2013-03-11 10:02:52

+0

類似的,可以參考 - http://stackoverflow.com/a/10995063/366964 – 2013-03-11 11:22:44

回答

1

我認爲這個問題是使用ElementCollection是不是一個很好的主意,如果一個就是想着填充大量的數據。

related issue here

我重新設計的數據庫,我現在用的是一個一對多與birectional關係。似乎有助於在子表中存在大量數據時在子表中插入新條目。

希望它可以幫助別人。

感謝所有的尋找和響應。