暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GBase 8a JDBC 流式处理实战:高效数据传输与实时处理技巧

原创 GBASE数据库 2025-06-13
62

原文链接: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技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论