GBase 8a 开发科普:JDBC 流式处理如何实现数据的 “连续流动”?一文讲透

原文链接:https://www.gbase.cn/community/post/5783
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

场景及原理

对于使用java程序对8a进行大批量数据的导出和抽取,往往会导致客户端内存超出或宕机情况出现。对于此类问题可以试用流式读取方式来避免。

原理为:可以通过数据流的方式,逐条从集群获取数据,将数据获取到JDBC应用所在内存中,从而减小大结果集对应用内存的影响。

启用方式

1)jdbc url 连接串启用 

        在后面增加useDynamicCharsetInfo=false&defaultFetchSize=-2147483648即可,实例如下:

jdbc:gbase://192.168.103.252:5258/test?useDynamicCharsetInfo=false&defaultFetchSize=-2147483648)

2)JDBC 流模式代码的实现方式

        setFetchSize的值必须为Integer.MIN_VALUE

package com.gbase.jdbc.simple;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
public class StatementReadBigData {
public void testBigData() throws Exception {
try {
Connection Conn = getConnectionWithProps();
Statement streamStmt = null;
try {
streamStmt = Conn.createStatement(
java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
streamStmt.setFetchSize(Integer.MIN_VALUE); /

测试用例

         新建测试表,数据量大概为1600万

1)不适用流式读取的时候,程序运行2分钟,内存升高到8g左右,还是没有读完数据,命令行没有数据处理的输出,如下图

2)使用流式读取的情况,程序运行1分多钟,就能读完所有数据,如下图

3)测试代码如下

package connectTest.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestDefaultFetchSize {

	public static void main(String[] args) {
		
		String url = "jdbc:gbase://192.168.55.2:5258/test?useDynamicCharsetInfo=false&defaultFetchSize=-2147483648";
		String user = "gbase";
		String password = "gbase20110531";

		Connection conn = null;
		Statement stm = null;
		ResultSet rs = null;
		
		System.out.println("start");
		
		try {
			conn = DriverManager.getConnection(url, user, password);
			stm = conn.createStatement();
			long starttime = System.currentTimeMillis();
			rs = stm.executeQuery("select * from bigdata;");
			long endtime = System.currentTimeMillis();
			
			System.out.println("query time is: " + (endtime - starttime));
			
			long rowCount = 0;
			while (rs.next()) {
				rowCount ++;
				if (rowCount % 1000000 == 0) {
					System.out.println("rowCount: " + rowCount);
				}
			}
			
			System.out.println("finished, rowCount: " + rowCount);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

原文链接:​​​​​​​https://www.gbase.cn/community/post/5783
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值