【发布时间】:2013-02-26 09:56:52
【问题描述】:
我的设置是:JBOSS AS 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。
我没有对 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)
而List是一个元素集合
@ElementCollection
private List<MyData> myData;
public List<MyData> getMyData() {
return myData;
}
【问题讨论】:
-
myDataList 集合中通常有多少条记录?您从 eventFromDb 中为要添加的每个 MyData 对象检索 MyData 集合。相反,您可以检索该集合一次并将所有项目添加到其中。您还应该检查保存 MyData 信息的表是否在外键上有索引,以便与保存 Event 数据的表关联。如果不是,仅此一项就可以解释为什么您的方法需要这么长时间才能完成。
-
通常我会说“使用 PgJDBC 的 COPY 协议支持来批量加载记录”,但我认为您不能通过 JPA 真正做到这一点。执行
getMyData().addAll(myDataList)可能会获得更好的结果,但它仍然会执行大量微小的插入,这仍然会很慢,特别是如果您在 DB 和应用服务器之间有很多往返时间。跨度> -
类似的,可以参考-stackoverflow.com/a/10995063/366964
-
@DirkTrilsbeek 我已经更改了您的建议的代码,但没有帮助。当大约有 10,000 条记录时,我开始看到延迟。保存 MyData 的表在外键上有一个索引,因为它与保存 Event 数据的表相关联。我在上面编辑的问题中为您添加了表格描述。知道我还能尝试什么吗?当我通过 psql CLI 插入记录时,我没有看到任何延迟。所以,应该归咎于我的交易。我应该调整一些配置以增加堆空间吗?但这只是一个临时解决方案,我想。谢谢。
-
@NayanWadekar 即使我只想插入一条记录,问题仍然存在。当记录超过 50,000 条时,添加一条记录需要超过 10 秒。有趣的是,插入一条或十条或二十条记录是同一时间,即 10 秒。我认为我应该使用标准查询来完成我的插入,而不是依赖实体管理器的合并作为持久方法来为我完成工作。谢谢。
标签: postgresql jpa ejb jboss7.x