我有1600万条记录的MySql表,因为一些迁移工作,我正在读取整个Mysql表。
以下代码用于在MySql中对大型MySql进行流处理
statement = connection.createStatement(
java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
statement.setFetchSize(Integer.MIN_VALUE);但这是一次一个结果的流,这是否意味着我们正在访问每一行的MySql服务器?
在使用流时,我们可以设置类似于这个statement.setFetchSize(1000)的东西;
我希望在流大型ResultSet的同时减少到服务器的往返次数
发布于 2014-07-10 13:04:23
我假设您使用的是官方的MySQL提供的/J。
您正在显式地告诉JDBC (和MySQL)用statement.setFetchSize(Integer.MIN_VALUE);逐行地流结果。
来自MYSQL文档
默认情况下,ResultSets被完全检索并存储在内存中。在大多数情况下,这是最有效的操作方式,并且由于MySQL网络协议的设计更容易实现。如果您正在使用具有大量行或大值的ResultSets,并且无法在JVM中为所需内存分配堆空间,则可以告诉驱动程序一次将结果流回一行。 要启用此功能,需要以下列方式创建语句实例: conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY);stmt.setFetchSize(Integer.MIN_VALUE); 前向只读结果集与取取大小Integer.MIN_VALUE的组合可作为驱动程序逐行流结果集的信号。在此之后,将逐行检索使用该语句创建的任何结果集。
除Integer.MIN_VALUE以外的任何用于获取大小的值都会被MySQL忽略,并应用标准行为。整个结果集将由JDBC驱动程序获取。
或者不使用setFetchSize(),所以JDBC驱动程序将使用默认值(0),或者显式地将值设置为0。使用0的值还将确保JDBC不使用MySQL游标,这可能会根据MySQL和Connector/J版本和配置而发生。
发布于 2020-07-24 01:21:11
要一次用固定数量的记录(例如,1000批记录)而不是使用MySQL JDBC驱动程序的记录流来获取记录,您需要这样做:
有关更多信息,请参见正式文档:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-implementation-notes.html
https://stackoverflow.com/questions/24676111
复制相似问题