向ManyToOne关联添加新实体需要大量的CPU功率

时间:2015-10-13 12:56:56

标签: postgresql jpa persistence

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

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

ArchiveMediasRecords是一个表,它为Record和AchiveMedia之间的关联提供属性信息。

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

我正在做类似的事情:

创建新记录
创建新的entitymanager(每个线程执行一个新的em)
创建一个交易,并启动它 对于声明的每个ArchiveMedia,通过ArchiveMediasRecords执行与Record的关联 坚持记录(级联声明很容易) 提交交易

数据库已更新,没有问题。

问题是,记录的数量可能非常大(> 400000)但ArchiveMedia不是(< 20)。

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

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

1 个答案:

答案 0 :(得分:0)

好的,因为我无法找到如何优化我的大量插入,我尝试了其他的东西:

我在没有关联的情况下插入记录实体。然后我使用jpa中的低级jdbc插入关联。

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

非常成功!

但这主要是一种解决方法,而不是一种真正的解决方案。无论如何,问题解决了。