JDBC 提取 SYS_REFCURSOR 在 Oracle 存储函数中打开时预提取

JDBC pre-fetch when fetching SYS_REFCURSOR opened in an Oracle stored function

我正在阅读一些关于 JDBC 预取大小的有趣内容,但我找不到以下几个问题的任何答案:

  1. 我正在开发的 Java 应用程序旨在从 PL/SQL 包中的函数打开和返回的游标中获取行。我想知道 JDBC 驱动程序的预取默认设置是否真的影响了获取过程,即在 Oracle 数据库中解析和打开的 SQL 语句。我尝试在 JBoss 配置文件上设置获取大小并打印从方法 setFetchSize() 获取的值。返回了新值(100,仅用于测试目的),但我看不出应用程序的执行方式有什么不同。

  2. 我也读到这个预取通过减少客户端和数据库服务器之间的往返次数来提高性能,但是我如何测量往返次数以验证并量化我最终可以通过调整预取大小获得的实际收益?

  1. 是的,Oracle JDBC 瘦驱动程序在从任何游标中获取时将使用配置的预取大小,无论该游标是由客户端打开的还是从存储过程中打开的。
  2. 计算往返次数的最简单方法是查看 sqlnet 跟踪。您可以通过将 trace_level_server = 16 添加到 sqlnet.ora 文件来在服务器端打开 sqlnet 跟踪(同样在服务器上,因为 JDBC thin 不使用 sqlnet.ora)。每个前台进程随后会将网络流量转储到跟踪文件中。然后您可以看到与客户端交换的网络数据包并计算往返次数。默认情况下,驱动程序以 10 行 10 行的形式获取行。但是由于您已将获取大小增加到 100,因此它应该在一次往返中获取最多该行数。

请注意,除非您的客户端远离您的服务器(大量 ping 时间),否则往返成本不会很高,除非您获取非常多的行数(10,000 秒),否则您会赢在增加获取大小方面,性能会出现很大差异。默认值 10 通常适用于大多数 OLTP 应用程序。如果您的客户端距离较远,那么您还可以考虑增加 SDU 大小(sqlnet 数据包的最大大小)。默认值为 8k,但您可以在 12.2 中将其增加到 2MB。