postgresql - 如何提高 Spring Data JPA 性能
问题描述
我正在尝试提高我的应用程序的性能,其中一项操作是从 CSV 文件中读取数据并将每一行的值作为一个 POJO(因此 1500 CSV 行 = 1500 POJO)存储在 PostgresSQL 数据库中。它是一个 Spring Boot 应用程序,并使用带有(默认配置)的 JpaRepository 作为持久性的手段。我最初的尝试基本上是循环的每次迭代中的这个语句,因为它读取 CSV 文件中的每一行:
autowiredRepoInstance.save(objectInstance);
但是,通过文件spring.jpa.show-sql=true
中的设置application.properties
,我看到每个 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
但也欢迎任何其他建议。
谢谢你。
解决方案
首先从 CSV 读取所有数据并进行如下处理
在输入文件上生成缓冲流
通过缓冲读取器生成流应用文件管理器或映射以处理数据
作为上面的输出,您将获得实体列表
将实体列表划分为列表实体列表(如果您有大量数据,例如超过一百万条记录)
批量传递实体内部列表(可以设置10000)JPA存储库保存方法(如果可能使用并行流)
通过上述过程,我在不到一分钟的时间内处理了 130 万条记录
或者使用一些批处理技术
推荐阅读
- firebase - Firestore 是否有内部机制来保护应用程序免受 DDOS 请求的过多收费?
- php - 将 SQL 转换为 Laravel
- javascript - 使用加密生成 iv 时获得相同的 iv
- kubernetes - 如何在k9s中列出kubernetes服务?
- architecture - 如何在可能发生冲突的分布式有界上下文中收敛状态?
- python - python 字符串格式:如何使用 str.format() 组合宽度和字典元素
- python - 我可以通过调用在另一台计算机上运行 linux/windows 的计算机上运行 python 脚本吗?
- android - 使用 Android 订阅限制功能
- c# - 给httpclient添加参数
- javascript - 将具有相同类名的所有元素的innerHTML插入到另一个元素中