将新实体添加到 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%。
大获成功!
但这主要是一种解决方法,而不是真正的解决方案。总之,问题解决了。
我在我的 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%。
大获成功!
但这主要是一种解决方法,而不是真正的解决方案。总之,问题解决了。