Решение для реализации слоя кэширования в PL / SQL - PullRequest
5 голосов
/ 31 марта 2011

У меня есть функция с 1 аргументом (дата), которая инкапсулирует 1 запрос как

SELECT COUNT(*)
  FROM tbl
 WHERE some_date_field BETWEEN param_date - INTERVAL '0 1:00:00' DAY TO SECOND
                           AND param_date

Что я хочу сделать - это где-нибудь кэшировать результат этого запроса с ttl = 1 минутой. Кэшированный результат должен быть доступен всем сеансам, а не только текущему.

Есть предложения?

PS: Да, я знаю о кеше результатов функции оракула, но он не соответствует требованиям.
PPS: Да, мы можем создать 2-й искусственный аргумент с некоторым значением, таким как date in format of yyyymmddhh24mi, поэтому он меняется каждую минуту, и мы можем использовать кэш результатов функции, но я надеюсь, что это решение, которое позволит мне скрыть кеширующие зависимости внутри .

Ответы [ 2 ]

5 голосов
/ 31 марта 2011

Я бы использовал глобальный контекст приложения и задание с интервалом обновления в 1 минуту для установки контекста.

PS: ИНТЕРВАЛ '1' ЧАС короче и болеезначимое, чем ИНТЕРВАЛ '0 1:00:00' ДЕНЬ ВТОРОЙ

4 голосов
/ 31 марта 2011

Вы хотите кэшировать результат этого запроса и использовать кеш по всем сеансам.Единственный способ, которым я могу придумать, - это обернуть запрос в вызов функции, сохранить результат в небольшой таблице.Функция запросит небольшую таблицу, чтобы узнать, было ли количество сохранено за последнюю 1 минуту, и, если это так, вернет его.

Чтобы сохранить таблицу маленькой, нужно периодически выполнять задание для удаления строк в«таблица кеша», которая старше 1 минуты или, что еще лучше, возможно, усекает ее.

Однако, я могу видеть это только в том случае, если исходный SELECT COUNT (*) является относительно дорогим запросом.

...