oracle - 如何增加 ORDS 中的 JDBC fetchSize 并提高大型结果集的响应时间?

标签 oracle jdbc oracle-ords

我们正在考虑使用 Oracle REST Data Services返回一些大数据集,但响应时间确实很慢。

与 Oracle 数据库相比,我们将 ORDS 服务器安装在不同的区域,因此存在一些延迟。

我们有一个端点,需要为结果集提供一个包含 10000 个项目的大页面:

BEGIN
ORDS.define_handler(
     p_module_name    => 'default',
     p_pattern        => 'programs/',
     p_method         => 'GET',
     p_source_type    => ORDS.source_type_collection_feed,
     p_source         => 'SELECT * FROM v_programs',
     p_comments       => 'Get a list of programs in the system.',
     p_items_per_page => 10000);
  COMMIT; 
END;
/

访问端点时,需要超过35秒才能得到结果: Response time in Postman

数据库执行时间其实很快,~10秒!主要问题似乎是由于 JDBC fetchSize 参数,许多往返是从服务器到数据库完成的。 The default value for this setting is 10 in Oracle ,在这种情况下导致响应缓慢。当访问页面大小为 10000 的端点时,完成了 1001 次提取: 1000 fetches being done!

我们想知道是否可以将 ORDS 中 JDBC fetchSize 的值从 10 更改为更高的值?如果我们可以将其更改为 1000,在这种情况下将会带来巨大的性能优势。

显而易见的解决方案是将 ORDS 服务器移至离数据库更近的位置,但在这种情况下我们无法这样做。

最佳答案

TL;DR - 将其添加到您的池配置中。

<entry key="defaultRowPrefetch">200</entry>

更长的答案 -

您的观察是正确的,我们没有偏离池/连接的默认 jdbc/ucp 设置,至少没有偏离 JDBC fetchSize。

但是。

  1. 这会变得更好。 我刚刚接受了一项增强请求,以使其更加智能。例如,随着模块及其 REST API 的页面大小增加,我们可以增加 jdbc 获取大小。另外,10 太低了,我们 REST API 的默认负载是 25 行,所以这是一个更合理的默认值。

  2. 您可以为池定义它。 将上面的输入键行添加到池配置 xml 文件中。

重新启动 ORDS 后,我可以轻松使用 REST API 进行测试,该 API 可返回 10,000 条记录。

enter image description here

我将提取大小设置为 200,需要 50 (+1) 次提取才能检索 GET 请求的 JSON 响应的 10,000 条记录。

关于oracle - 如何增加 ORDS 中的 JDBC fetchSize 并提高大型结果集的响应时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76367032/

相关文章:

mysql - JDBC prepareStatement 不起作用

oracle - 安装 ORDS(没有 APEX)

sql - 存储过程使用游标返回多个查询结果

sql - 如何在 oracle 中拆分以空格分隔的字符串并将每个单词添加到 Oracle 11g 中的不同行?

Oracle:使用全扫描而不是复合索引

使用 ORDS 和 Oracle Apex 重写 Tomcat 9

java - 无法使用 jbdc updateRow 方法更新 Oracle IOT 表

Java ResultSet 内存不足,无法使用PreparedStatement 更新

java - 无法在 Cloud Foundry 中使用 Spring Cloud 连接器设置连接属性