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();
}
}
}
}
评论
登录后才可以发表评论


热门帖子
- 12023-05-09浏览数:16881
- 22019-04-26浏览数:10294
- 32020-05-11浏览数:10277
- 42023-09-25浏览数:9681
- 52023-07-04浏览数:9507