【发布时间】:2018-12-31 02:21:39
【问题描述】:
我们正在使用 java 从 oracle/mssql 数据库中下载大约 1000 万条数据。
我们一次获取 5000 条记录,获取 5000 条记录需要 5 分钟,具体取决于位置条件,因此获取和下载 1000 万条记录将需要 (1000 万/5000) *5 分钟,即 10000 分钟。
我们曾尝试一次获取 100000 条记录,但可能会遇到堆空间问题。
有什么办法可以优化吗?
【问题讨论】:
-
将
fetchSize设置为较大的值无济于事,反而会消耗更多内存。试试fetchSize = 100。获取数据库中的所有数据需要多少时间?也许问题不在于 Java/JDBC,而在于 SQL 查询本身?如果查询速度很快,也许您可以以某种方式将其拆分以将数据提取到多个 Java 线程中 -
这里的问题是,在每 5000 条记录将 rownum 从 1-5000 和 5000-10000 更改为 1000 万之后,我们一次又一次地执行相同的查询,即使在数据库中,该查询也需要 5 分钟,有没有办法只执行一次查询并从 5000 组中获取所有记录。
-
使用适用于 JDBC 的 oracle 驱动程序,您只需执行一次查询,然后只需遍历
ResultSet。驱动以fetchSize记录批量加载数据到内存中。 -
问题是如果我们执行一次查询,那么1000万数据全部加载到结果集中,这将导致堆内存,这就是我们一次获取5k行的原因。
-
取决于您用于执行查询的内容,但使用普通的旧 JDBC 和 oracle SQL 驱动程序仅将
fetchSize加载到内存中。当然,如果您不将每条记录都添加到一个巨大的List或任何其他集合中
标签: java sql-server database oracle11g oracle10g