logo
GBase 8a
性能调优
文章

南大通用gbase 8a jdbc流式处理

echo-duanhuanhuan
发表于2025-06-07 21:05:0870次浏览0个评论

场景及原理

对于使用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();
			}
		}
	}
}

评论

登录后才可以发表评论