Кэш-контроль с Oracle ORDS
Моя БД получает новые данные только с 13:00 до 14:00. Пользователи прыгают вперед и назад, часто глядя на одно и то же несколько раз, я хочу использовать кэширование для сокращения нагрузки на сеть. Мой тип ответа:
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
Ответ SYS_REFCURSOR в одной строке с несколькими вложенными CURSORS.
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 часа
- Запрос в 13:30 - кеш 0 минут
- Запрос в 15:30 - кеш 21,5 часа
Проблема в том, что я не могу понять, как вообще установить кэширование для конечной точки ORDS, возвращающей HTTP GET. У меня есть один работает нормально для несвязанных службы 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, потому что:
- HTTP GET не поддерживается PL/SQL
- SYS_REFCURSOR в качестве параметра ORDS PL/SQL out не поддерживается
Единственный вариант, который я смог выяснить, - это настройка статического кэша в 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 является монолитом и получает одну настройку управления кэшем.
- Это фиксированное значение.