我们有一个物联网应用程序,它接收kafka上的数据并处理它在rdbms中保存的数据。我们使用的数据库(MemSql)每秒支持超过20000次插入。但是使用我常规的repository.save方法,我每秒只能完成50次插入。我编写了一段简单的代码,在一个高速网络的aws ec2实例上进行了测试。
void saveA(){
for(int i=0;i<1000;i++){
A obj = new A();
aRepository.save(obj);
}
}
这需要20秒才能完成。我希望达到每秒1000k左右的插入。如何提高这种摄取速度?我应该创建一个1000大小的线程池,然后从单独的线程调用save吗?在这种情况下,我是否需要关心像spring.datasource.tomcat.max-active这样的属性来增加池中的连接数量?spring data会自动从池中为每个线程挑选一个单独的连接吗?我不能做批量插入,因为我从kafka中一次读取一个数据,也因为可能有一些重复的数据,我需要捕获为DataIntegrityViolationException并更新。
发布于 2021-06-21 17:24:57
你没有描述你要保存的对象有多复杂,但听起来你有相当简单的对象,即每次保存操作的插入比率接近1,而且你似乎也不会做太多的更新。
如果是这样的话,我建议放弃JPA,直接使用JDBC (使用JdbcTemplate
)。
原因是JPA做了很多事情来使典型的JPA流程工作:加载实体图,操作它,并将其刷新回数据库。但是您不这样做,因此JPA可能没有太大帮助,并且会使您的工作变得困难,因为您需要调优JPA和JDBC。
从使用JdbcTemplate
直接执行插入开始。
下一步是执行批量插入。您写道,您不能这样做,但我不明白为什么在将它们写入数据库之前,您不能收集一些行。
https://stackoverflow.com/questions/68064550
复制相似问题