【发布时间】:2015-06-15 10:33:40
【问题描述】:
我正在使用 java jdbc 应用程序从 DB 中获取大约 500,000 条记录。正在使用的数据库是 Oracle。获取每一行后,我将数据写入文件。由于完成获取整个数据大约需要一个小时,因此我正在尝试增加结果集的获取大小。我在多个链接中看到,在增加获取大小的同时,应该注意内存消耗。增加 fetch 大小实际上会增加 jvm 使用的堆内存吗?
假设提取大小为 10,并且程序查询总共返回 100 行。在第一次提取期间,结果集包含 10 条记录。一旦我读取了前 10 条记录,结果集就会获取下 10 条记录。这是否意味着在第二次获取后数据集将包含 20 条记录?较早的 10 条记录是否仍保留在内存中,还是在获取新批次时被删除?
任何帮助表示赞赏。
【问题讨论】:
-
Oracle 驱动程序只会在内存中保存由 fetchSize 定义的行数。因此,当第二次提取完成时,第一次提取的行将被释放并收集垃圾。但是 500.000 行的一个小时似乎非常慢。您确定您受到获取的限制,而不是语句本身吗?如果在 SQL*Plus 中使用
set autotrace traceonly,语句会运行一个小时吗?您应该测量executeQuery()和第一个ResultSet.next()调用之间的时间 - 我猜,您正在等待 Oracle 准备查询结果 -
是的,一个小时包括所有查询结果的提取。我希望增加提取大小可以减少整体提取时间。
-
我执行的结果语句从互联网上的外部数据库中获取数据,然后我开始从结果集中写入我的本地文件,它开始写入,但是每当互联网断开连接时,写入就会中断。是不是因为结果集动态获取数据并写入文件?
标签: java oracle performance jdbc