OceanBase 游标结果集
游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。
结果集分类
结果集按照配置分为以下三种:
-
常规结果集:一次获取到所有的结果,执行速度最快但容易引发
OOM
。 -
流式结果:不一次性读取全部的数据,而是一行一行从 Socket 中读取数据。
statement.setFetchSize(Integer.MIN_VALUE)
就可以使用流式结果集。流式结果集执行速度快,但是一旦开始读取就无法停止,而且容易造成网络问题。 -
游标结果集:需要
COM_STMT_FETCH
支持且需要开启 PS(即设置useServerPrepStmts=true
)。设置语法为useCursorFetch=true
,还需要指定fetchSize
。游标结果集执行速度慢,并且要求 ODP V1.8.5 及 OBServer V2.2.75 以上版本。
useCursorFetch 使用方法
游标结果集(useCursorFetch
)的使用方法如下:
-
建立链接,设置参数
useCursorFetch
和useServerPrepStmts
。String url = "jdbc:mysql://host:port/test?useServerPrepStmts=false&useCursorFetch=true"conn = DriverManager.getConnection(url,"admin@mysql", "admin");
-
生成 Prepare 语句。
PreparedStatement pstmt = conn.prepareStatement("select * from tab",ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
-
设置
fetchsize
。pstmt.setFetchSize(3);
-
执行语句。
ResultSet rs = pstmt.executeQuery();
-
循环获取下一行数据。
while (rs.next()) {}