关于mysql jdbc驱动fetchSize属性的说明
【README】
1)fetchSize作用: 当数据库有大量数据满足查询条件时,如有100w,这些如果一次性加载到jvm(java查询客户端),可能存在jvm因堆内存不足导致oom; 为了解决这个问题,我们在查询时可以设置fetchsize属性,即提示jdbc驱动程序每次网络请求从数据库返回的数据行数;若结果集很大超过fetchsize大小,则jdbc驱动程序需要向数据库服务器发起多次网络请求;
2)本文参考:MySQL :: MySQL Connector/J Developer Guide :: 6.4 JDBC API Implementation Noteshttps://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html
有2种方法设置fetchsize;
1)方法1: 设置fetchsize为 Integer.MIN_VALUE;
表示同一个查询连接上,jvm向db发送的每次网络请求仅返回一行数据; 即逐行传输结果集; 如果满足条件的数据量是1000条,则需要1000次网络连接;
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
2)方法2:连接串设置useCursorFetch=true,且stmt设置fetchsize为整数n;
则同一个查询连接上每次网络请求返回n行数据;(下述代码设置fetchsize为100); 如果满足条件的数据量是1000条,则需要10次网络连接;
conn = DriverManager.getConnection("jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t");
stmt = conn.createStatement();
stmt.setFetchSize(100);
rs = stmt.executeQuery("SELECT * FROM your_table_here");