Кэш-контроль с 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, потому что:

  1. HTTP GET не поддерживается PL/SQL
  2. 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>

Но это нежелательно по ряду причин:

  1. Это относится ко ВСЕМ сервисам в ORDS, но кэширование является плохой идеей для большинства других конечных точек. Мне не удалось отфильтровать более точно, чем это - с точки зрения Tomcat кажется, что ORDS является монолитом и получает одну настройку управления кэшем.
  2. Это фиксированное значение.

0 ответов

Другие вопросы по тегам