
# 完整示例
```
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和[完整示例](https://support.huaweicloud.com/bestpractice-gaussdb/gaussdb-22-0104.html#ZH-CN_TOPIC_0000002663699809)中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。
 
