大量提高插入性能

时间:2012-11-13 05:58:19

标签: spring-data-jpa bulkinsert

在我的应用程序中,我需要大量提高插入性能。示例:具有大约21K记录的文件需要超过100分钟才能插入。有理由可能需要一些时间,比如20分钟左右,但超过100分钟就太长了。

将数据插入3个表(多对多)中。 Id是从序列生成的,但我已经用Google搜索并将hibernate.id.new_generator_mappings = true和allocationSize +序列增量设置为1000。

此外,数据量也不算特别,文件为90 mb。

我已经使用visual vm验证了大部分时间花在了jdbc驱动程序(postgresql)和hibernate上。我认为该问题与子表中的唯一约束有关。服务层在插入之前进行手动检查(= SELECT)。如果记录已经存在,则重用它而不是等待约束异常。

因此,对于特定文件的总结,每个表将有1个插入(可能不同但不适用于此文件,这是理想(最快)的情况)。这意味着总共60k插入+ 20k选择。仍然超过100分钟似乎很长(是的硬件计数,它是在一个简单的PC驱动器7200转,没有ssd或raid)。然而,这是对先前应用程序(普通jdbc)的改进版本,在该应用程序上,此硬件上的相同插入大约需要15分钟。考虑到在两种情况下,大约4-5分钟用于“预处理”,这种增加是巨大的。

有什么提示可以改进吗?有没有批量加载功能?

2 个答案:

答案 0 :(得分:5)

spring-data JPA: manual commit transaction and restart new one

在每次调用save()方法后添加entityManager.flush()entityManager.clear()。如果你使用hibernate添加hibernate.jdbc.batch_size=100这似乎是一个合理的选择。

性能提升> 10倍,可能接近100倍。

答案 1 :(得分:-1)

听起来像是一个数据库问题。检查你的表,如果他们使用InnoDB或MyISAM,后者在我的经验非常慢插入并且是新dbs的默认值。尽可能删除外键

如果您的问题确实与单个唯一索引有关,那么InnoDB可以解决问题。