在 Oracle 存储函数中打开获取SYS_REFCURSOR时进行 JDBC 预取



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

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

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

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

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

最新更新