【发布时间】:2018-12-10 20:16:16
【问题描述】:
我正在尝试提高我的应用程序的性能,其中一项操作是从 CSV 文件读取数据并将每一行的值作为一个 POJO(因此 1500 CSV 行 = 1500 POJO)存储在 PostgresSQL 数据库中.它是一个 Spring Boot 应用程序,并使用带有(默认配置)的 JpaRepository 作为持久性的手段。我最初的尝试基本上是循环的每次迭代中的这个语句,因为它读取 CSV 文件中的每一行:
autowiredRepoInstance.save(objectInstance);
但是,使用 application.properties 文件中的 spring.jpa.show-sql=true 设置,我看到每个 POJO 都有一个插入操作。我提高性能的尝试是在循环外声明一个 ArrayList,将 POJO 的每个实例保存在循环内的该列表中,并在每 500 个项目执行一次保存,如下所示(暂时忽略有更多/小于500的倍数):
loop(
objList.add(objectInstance);
if (objList.size() == 500) {
autowiredRepoInstance.save(objList);
objList.clear();
}
)
但是,这也会生成单独的插入语句。我可以更改哪些设置来提高性能?具体来说,我想尽量减少 SQL 语句/操作的数量,并让底层 Hibernate 使用 postgresql 允许的“多行”插入:
https://www.postgresql.org/docs/9.6/static/sql-insert.html
但也欢迎任何其他建议。
谢谢。
【问题讨论】:
-
@a_horse_with_no_name 我更新了参考资料。我正在使用 9.6。
-
如果您自己编写
INSERT .. SELECT,您将获得最佳性能,但可接受的解决方案是使用Hybernate Batch Insert。这类似于 multirow 插入的概念。在您的环境中进行测试时必须检查的最佳批量大小。 -
你应该使用批量插入:stackoverflow.com/a/50882952
-
@Cepr0 我看了你的回答,但由于某种原因,我的仓库没有
saveAll方法,即使它也是JpaRepository。 -
@ITWorker
saveAll()方法从 Spring Boot 2.0 开始。在上一个。版本可以使用save()方法。
标签: postgresql performance spring-boot jdbc spring-data-jpa