我的MySql表有1600万条记录,因为有些迁移工作我正在阅读整个Mysql表。
以下代码用于在MySql中传输大型ResultSet
statement = connection.createStatement(
java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
statement.setFetchSize(Integer.MIN_VALUE);
但这是一次流式传输一个结果,是否意味着我们每行都在点击MySql服务器
在使用流媒体时我们可以设置类似这样的语句.setFetchSize(1000);
我希望在流式传输大型ResultSet时减少到服务器的往返次数
答案 0 :(得分:4)
我将假设您正在使用官方MySQL提供的JDBC驱动程序Connector / J.
您明确告诉JDBC(和MySQL)使用statement.setFetchSize(Integer.MIN_VALUE);
来自MYSQL Docs:
默认情况下,ResultSet完全检索并存储在内存中。 在大多数情况下,这是最有效的操作方式,并且由于 MySQL网络协议的设计更容易实现。如果 您正在使用具有大量行数的ResultSet 大值,并且无法在JVM中为堆空间分配堆空间 需要内存,您可以告诉驱动程序返回结果 一次一行。
要启用此功能,您需要创建一个Statement实例 以下列方式:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); stmt.setFetchSize(Integer.MIN_VALUE);
只进,只读结果集与获取的组合 Integer.MIN_VALUE的大小用作驱动程序要流式传输的信号 结果逐行设置。在此之后,使用。创建任何结果集 语句将逐行检索。
MySQL会忽略除Integer.MIN_VALUE
以外的任何取值大小的值,并且标准行为适用。整个结果集将由JDBC驱动程序获取。
要么不使用setFetchSize()
,要么JDBC驱动程序将使用默认值(0
),或者将值明确设置为0
。使用0
的值还将确保JDBC不使用MySQL游标,这可能会发生,这取决于您的MySQL和Connector / J版本和配置。