我在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上的简单关联过程?
答案 0 :(得分:0)
好的,因为我无法找到如何优化我的大量插入,我尝试了其他的东西:
我在没有关联的情况下插入记录实体。然后我使用jpa中的低级jdbc插入关联。
它允许将java进程的CPU负载从20%降低到1%,并将postgresql进程的cpu负载从18%降低到< 1%。
非常成功!
但这主要是一种解决方法,而不是一种真正的解决方案。无论如何,问题解决了。