2013-03-11 73 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关系。似乎有助于在子表中存在大量数据时在子表中插入新条目。

希望它可以帮助别人。

感谢所有的寻找和响应。