更新时间:2025-08-19 GMT+08:00
分享

完整示例

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

public class StreamQueryTest {
    // 连接数据库。
    public static Connection getConnection() throws ClassNotFoundException, SQLException {
        String driver = "com.huawei.gaussdb.jdbc.Driver";
        // 指定数据库sourceURL($ip、$port、database自行修改),连接参数enableStreamingQuery设置为true。
        String sourceURL = "jdbc:gaussdb://$ip:$port/database?enableStreamingQuery=true";
        // 用户名和密码从环境变量中获取。
        String userName = System.getenv("EXAMPLE_USERNAME_ENV");
        String password = System.getenv("EXAMPLE_PASSWORD_ENV");
        Class.forName(driver);
        return DriverManager.getConnection(sourceURL, userName, password);
    }

    public static void main(String[] args) {
        String selectSql = "select * from tab_test order by id asc limit ?";
        // 使用try-with-resources语法进行资源释放。
        try (Connection conn = getConnection(); PreparedStatement preparedStatement = conn.prepareStatement(selectSql,
            ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) {
            preparedStatement.setInt(1, 100000);
            // 执行流式查询,将fetchSize设置为Integer.MIN_VALUE,再执行executeQuery查询数据。
            preparedStatement.setFetchSize(Integer.MIN_VALUE);
            int totalCount = 0;
            try (ResultSet resultSet = preparedStatement.executeQuery()) {
                while (resultSet.next()) {
                    // 处理查询结果,示例代码仅打印部分查询结果和数据总条数。
                    if (totalCount++ < 5) {
                        System.out.println("row:" + resultSet.getRow() + ",id :" + resultSet.getInt(1));
                    }
                }
                System.out.println("totalCount:" + totalCount);
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}

结果验证

  1. 将gaussdbjdbc.jar和完整示例中StreamQueryTest.java放入同一目录。
  2. 编译并执行示例代码,执行时设置JVM最大堆内存为16MB。
    javac -classpath ".:gaussdbjdbc.jar" StreamQueryTest.java
    java -Xmx16M -classpath ".:gaussdbjdbc.jar" StreamQueryTest
  3. 完整示例可正常运行,不出现内存溢出错误。执行流式查询时,每次结果集中只保留一条数据,resultSet.getRow()返回值为1。因此代码执行结果如下:
    row:1,id :1
    row:1,id :2
    row:1,id :3
    row:1,id :4
    row:1,id :5
    totalCount:100000

回退方法

  • 关闭单条语句的流式查询功能:删除Statement、PreparedStatement的setFetchSize(Integer.MIN_VALUE)。
  • 关闭当前连接的流式查询功能:连接参数enableStreamingQuery设置为false。

相关文档