java - 无游标的 JDBC 读取
问题描述
我必须从数据库中读取大量数据(例如让我们考虑超过 500 000 条记录)。然后我必须将读取的数据保存到文件中。我对光标有很多问题(不仅仅是内存问题)。
是否可以在没有光标的情况下执行此操作,例如使用流?如果是这样,我该如何实现?
解决方案
我曾处理过大量数据(近 5 亿条记录)。我只是使用 PreparedStatement 查询、ResultSet 和一些缓冲区调整:
setFetchSize(int)
就我而言,我将程序拆分为线程,因为巨大的表被分区(每个线程处理一个分区),但我认为这不是你的情况。通过游标获取数据是没有意义的。我宁愿使用数据库视图或 SQL 查询。不要为此目的使用 ORM。
根据您的评论,您最好的选择是限制 JDBC 仅获取特定数量的行而不是获取所有行(这有助于更快地开始处理并且不会将整个表加载到 ResultSet 中)。将数据保存到集合中并使用 BufferedWriter 将其写入文件。您还可以从多核 CPU 中受益,使其在更多线程中运行 - 比如第一个获取的行在 1 个线程中运行,其他获取的行在第二个线程中运行。如果是线程,请使用同步集合,并注意您可能会遇到排序问题。
推荐阅读
- laravel - Laravel 不等于不按预期工作
- pine-script - 如何在 pinescript 中制作多个时间框架 ichimoku 指标?
- reactjs - React JS APP中如何管理多个角色?
- c# - SQL Uniqueidentifier 和 hashbytes 与 c# 不匹配
- java - 带空格的 Java 格式数字
- python - 是否有统计测试来检查python中组之间的变异系数(相对标准偏差)的差异?
- node.js - ansi-html 中不受控制的资源消耗
- hive - 在 Hive 3.1.3 中将时间戳从 ms 转换为字符串格式
- python - 在 Pandas 的列中替换多个字符串值的更快方法
- spring-boot - 从 Spring Boot 低版本迁移到高版本后 @Valid 的编译错误