【问题标题】:insert taking too long插入时间过长
【发布时间】: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


【解决方案1】:

我认为问题在于,如果考虑填充大量数据,使用 ElementCollection 并不是一个好主意。

related issue here

我重新构建了数据库,因此我现在使用具有双向关系的一对多。当子表中已有大量数据时,似乎有助于在子表中插入新条目。

希望对某人有所帮助。

感谢大家的关注和回复。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2021-07-24
    • 2016-08-13
    • 2017-12-05
    • 1970-01-01
    相关资源
    最近更新 更多