【发布时间】:2016-05-22 15:16:16
【问题描述】:
根据我的阅读,我看到使用 MySQL JDBC 驱动程序在 MySQL 中流式传输 ResultSet 的方法是这两个命令:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
我的问题是专家能否澄清使用上述代码流式传输 ResultSet 是否将一行返回给客户端,然后转到服务器以获取下一行等等(效率极低),或者它是否足够聪明,可以像BufferedStreamReader?如果是缓冲流,如何设置缓冲大小?
编辑:来自doc:
只进、只读的结果集与 fetch 的组合 Integer.MIN_VALUE 的大小用作驱动程序流式传输的信号 结果集逐行。在此之后,使用 语句将逐行检索。
这是否意味着如果我有 1000 万行,那么有 1000 万次往返服务器来获取这些行?这是非常低效的。如何流式传输ResultSet 但将其缓冲以便我不必进行如此多的往返?
EDIT2:当 fetchSize 设置为 Integer.MIN_VALUE 时,MySQL 似乎会自动进行一些缓冲。在我的测试中,我能够使用setFetchSize(Integer.MIN_VALUE) 在不到 20 分钟的时间内读取超过 40M 行。这相当于每秒大约 30,000 行。我不知道平均行有多大,但很难想象每秒 30,000 次往返。
还有一个单独的问题:如果结果集的元素多于 fetchSize,MySQL 会做什么?例如,结果集有 10M 行,而 fetchSize 设置为 1000。那么会发生什么?
【问题讨论】:
-
fetchsize 定义流式传输的缓冲区大小。是的,在这种情况下,缓冲区大小为 1
-
请重新阅读我的问题,看看您是否能区分这里和其他地方的问题。
-
是的单词不同,但问题不是。