我的数据库仅在下午 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 案例,因为:
- PL/SQL 不支持 HTTP GET
- 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>
但出于多种原因,这是不可取的:
- 它适用于 ORDS 下的所有服务,但缓存对于大多数其他端点来说是个坏主意。我无法比这更精确地过滤 - 从 Tomcat 的角度来看,ORDS 似乎是一个整体,并且获得了一个缓存控制设置。
- 它是一个固定值。