将新实体添加到 ManyToOne 关联需要很多 cpu 的权力

Adding a new entity to a ManyToOne association takes a lot of cpu power

我在我的 jpa 应用程序中使用 eclipselink 和 postgresql。

我有 3 个这样链接的 table:将 @OneToMany 记录到 ArchiveMediasRecords,将 AchiveMedia @OneToMany 记录到 ArchiveMediasRecords,将 ArchiveMediasRecords 与 @ManyToOne 记录到 Record 和 AchiveMedia。

ArchiveMediasRecords 是 table 为 Record 和 AchiveMedia 之间的关联提供属性信息。

我的问题是,我每 100 毫秒插入一个记录,并且插入是使用 10 个线程的池完成的。

我正在做类似的事情:

创建新记录
创建新的实体管理器(每个线程执行一个新的 em)
创建交易并启动它
对于声明的每个 ArchiveMedia,通过 ArchiveMediasRecords
与 Record 进行关联 持久化记录(cascade 声明的很好,让它更简单)
提交交易

数据库已更新,没问题。

问题是记录的数量可以很大(> 400000)但 ArchiveMedia 不是(< 20)。

当我将记录添加到 archivemedia 时,在 ArchiveMedia 中的 @OneToMany 关联的 IndirectList 上添加的方法需要花费大量时间和大量 cpu 功率。

有没有办法减少大 XXXToMany 上的简单关联过程?

好的,因为我无法找到优化大量插入的方法,所以我尝试了其他方法:

我正在插入没有关联的记录实体。然后我使用来自 jpa 的低级别 jdbc 插入关联。

它允许将 java 进程 cpu 负载从 20% 降低到 1%,并将 postgresql 进程 cpu 负载从 18% 降低到 < 1%。

大获成功!

但这主要是一种解决方法,而不是真正的解决方案。总之,问题解决了。