4

我的数据库仅在下午 1 点到 2 点之间获取新数据。用户来回跳转,经常多次看同一个东西,想用缓存来减少网络负载。我的回复类型是:

source_type_collection_item
   Executes a SQL Query returning one row of data into a ORDS Standard JSON representation. 
   Available when the HTTP method is GET. 
   Result Format: JSON

具有多个嵌套 CURSORS 的单行 SYS_REFCURSOR 响应。

FUNCTION my_func RETURN SYS_REFCURSOR
AS
   my_cursor SYS_REFCURSOR;
BEGIN
   OPEN my_cursor FOR
   SELECT value, CURSOR(SELECT value_2, CURSOR(SELECT ... FROM table)
...

我想根据服务器时间设置不同的缓存控制:

  • 上午 9:30 请求 - 缓存 3.5 小时
  • 下午 1:30 请求 - 缓存 0 分钟
  • 下午 3:30 请求 - 缓存 21.5 小时

问题是我根本不知道如何为返回 HTTP GET 的 ORDS 端点设置缓存。对于不相关的 PL/SQL 服务,我有一个工作正常

   source_type_plsql :-
      Executes an anonymous PL/SQL block and transforms any OUT or IN/OUT parameters into a JSON representation. 
      Available only when the HTTP method is DELETE, PUT, or POST. 
      Result Format: JSON

使用定义的参数:

    ords.define_parameter(
       p_module_name         => l_module_name,
       p_pattern             => l_pattern,
       p_method              => l_method,
       p_name                => 'Cache-Control',
       p_bind_variable_name  => 'cache_control',
       p_source_type         => 'HEADER',
       p_param_type          => 'STRING',
       p_access_method       => 'OUT',
       p_comments            => '');

但这不适用于 GET 案例,因为:

  1. PL/SQL 不支持 HTTP GET
  2. SYS_REFCURSOR 作为 ORDS PL/SQL 输出参数不受支持

我能想到的唯一选择是 Tomcat 中的静态缓存设置,而不是 ORDS。

<filter>
   <filter-name>ExpiresFilter</filter-name>
   <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
   <init-param>
      <param-name>ExpiresByType application/json</param-name>
      <param-value>access plus 30 minutes</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>ExpiresFilter</filter-name>
   <url-pattern>/ords/*</url-pattern>
   <dispatcher>REQUEST</dispatcher>
</filter-mapping>

但出于多种原因,这是不可取的:

  1. 它适用于 ORDS 下的所有服务,但缓存对于大多数其他端点来说是个坏主意。我无法比这更精确地过滤 - 从 Tomcat 的角度来看,ORDS 似乎是一个整体,并且获得了一个缓存控制设置。
  2. 它是一个固定值。
4

0 回答 0