Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 одновременное использование client result cache и server result cache  [new]
Shtock
Member

Откуда: СПб
Сообщений: 2961
Народ, клиентский и серверный кэш одновременно могут использоваться как говорит оракловая документация. Но, предположим, для части запросов я хочу использовать серверный, а для другой клиентский. И тот и тот включаются хинтом /*+ result_cache*/. Как-то можно jdbc-драйверу указать, что надо использовать именно серверный или именно клиентский кэш?


При этом не только меня это интересует, но найти ответ я не смог.
4 ноя 17, 23:30    [20927922]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
Valergrad
Member

Откуда:
Сообщений: 468
Shtock,

По-моему result_cache - это вполне конкретный серверный кэш результатов. Ничего подобного на клиенте нет и быть не может - ведь откуда клиенту знать, что данные не изменились с момент последнего кэширования? Это может знать только оракл.
5 ноя 17, 05:25    [20928111]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 5992
Shtock,

Не очень понятно, зачем?

Valergrad,

Беглый поиск в гугле, выдает "The Oracle Call Interface (OCI) client result cache is a memory area inside a client process that caches SQL query result sets for OCI applications. This client cache exists for each client process and is shared by all sessions inside the process. Oracle recommends client result caching for queries of read-only or read-mostly tables."


По запросу "Oracle JDBC result cache" гугл ничего мне не нашел.

Но, вроде, Prepared Statement'ы кешируются и соответственно кешируются все выделенные им ресурсы. В свое время с этим разбирался, но это скорее было проблемой, чем плюсом. Т.к. JDBC Prepared Statement'ы живут в рамках соединения, а современные приложения часто не открывают соединение, а просто берут его из пула случайным образом, то кэш Prepared Statement'ов забивался полностью случайными запросами (соединение фактически собирало мусор по всем модулям приложения) и получался жуткий overhead ресурсов.

Можно ли для Prepared Statement'а кешировать и итоговый Result Set, не помню. В практической ценности такой операции крайне сомневаюсь, если приложения работает поверх какого нибудь пула соединений. Т.к. кеш будет мгновенно замусориваться.

IMHO & AFAIK
5 ноя 17, 05:50    [20928115]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 5992
OCI документация уверяет:

"This function (OCIStmtPrepare2) can be used with and without statement caching. This is determined at the time of connection or session pool creation. If caching is enabled for a session, then all statements in the session have caching enabled, and if caching is not enabled, then all statements are not cached."

Вроде единственная возможность предоставляемая OCI это проверить, что в данной момент времени запрос присутствует в кеше

"OCI_PREP2_CACHE_SEARCHONLY - In this case, if the statement is not found (a NULL statement handle is returned), you must take further action. If the statement is found, OCI_SUCCESS is returned. Otherwise, OCI_ERROR is returned."

но практический смысл этой операции от меня ускользает.

Избежать попадание запроса в client result cache похоже что и никак (см. первую цитату)

IMHO

p.s. сам с этим не сталкивался
5 ноя 17, 06:40    [20928121]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
Valergrad
Member

Откуда:
Сообщений: 468
А, сорри, есть еще клиентское кэширование, был неправ.

Тогда не знаю, довольно мутно написано. Вероятно можно управлять через лимиты размеров, но на уровне отдельного sql - не видно как.
5 ноя 17, 07:22    [20928128]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
Shtock
Member

Откуда: СПб
Сообщений: 2961
Не, для jdbc он тоже есть. Можно найти именно по документации про драйвера. Но пока так и не ясно, можно ли...
5 ноя 17, 11:04    [20928253]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
Shtock
Member

Откуда: СПб
Сообщений: 2961
А ценность понятна. Клиентский кэш консистентен через некоторое время, а серверный постоянно. Для некоторых вещей это важно, я думаю.
5 ноя 17, 11:06    [20928256]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
Shtock
Member

Откуда: СПб
Сообщений: 2961
В общем то я окончательно запутался.

Абсолютно неясно, как трактовать фразу

Oracle
When a transaction modifies the data or metadata of any of the database objects used to construct that cached result, invalidation will be sent to the OCI client on its subsequent round trip to the server. If the OCI application does no database calls for a period of time, then the client cache lag setting will force the next OCIStmtExecute() call to make a database call to check for such invalidations.


то есть неясен смысл этого lag. Идёшь в БД любым statement и тебе приходит инвалидация. Наступает cache lag и этот же любой statement проверяет эти же инвалидации. Т.е. масло масляное.
5 ноя 17, 22:55    [20929140]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 5992
Мне вообще смысл этих кэшей для прикладной системы не очень понятен. Или жуткий бизнес-специфик или программисты очень сильно старались и думали той частью тела, на которой обычно сидят.

Т.к. приход от клиента одинаковых запросов да еще и в "близкое" время, это скорее похоже на ошибки разработки

Shtock
...
то есть неясен смысл этого lag. Идёшь в БД любым statement и тебе приходит инвалидация. Наступает cache lag и этот же любой statement проверяет эти же инвалидации. Т.е. масло масляное.

Смысл lag (при этом дефолтно вроде вообще 3 сек., т.е. очень маленький) вполне понятен - банальное энергосбережение в ситуации если прикладной софт "отключился" (например для UI приложения - пользователь ушел на обед, а из приложения не вышел). В противном случае мы всегда будем забивать сеть пакетами для валидации кеша, а все технологии энергосбережение ОС пойдет коту под хвост.

Другое дело, что действительно получается масло-масленное и жуткий overhead на сеть, кроме валидации при round-trip'ах инициализирумых со стороны приложения, еще и round-trip'ы со стороны сервера отсылаются для валидации кеша.

Единственный бизнес применение, которое я могу себе _вообразить_ - real-time, когда задержка в 50-100 ms. уже критична. Тогда, скорее всего, такое кэширование и дублирование валидации может сократить задержки (latence). Ну или какие либо алгоритмы сервисов построенные на периодической опросе и, опять таки, с бизнес критичностью по времени (но не очень понятно насколько и чем при такой архитектуре думали программисты)

Но сам я ни разу с real-time приложениями завязанными на СУБД (а тем более Oracle) не сталкивался.
12 ноя 17, 17:58    [20947189]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
orac_list
Member

Откуда:
Сообщений: 93
Могут быть side эффекты

Effect of client_result_cache_size On Client Applications Or OCI Based Applications (Doc ID 1300727.1)

'client_result_cache_size' is stored on the Client side. Once that limit have reached to the maximum then all other subsequent connections will fail. That is why it is recommended to set to 0 for high volume of transactions in which case there will be no caching. Even if there's a limit it gets reset only when the Database is bounced.

What v$ Tables Track The Usage Of New Result Cache Feature In 11gR1 (11.1.0.x) And Higher ? (Doc ID 942367.1)

tracking of cache statistics

client_result_cache_stats$

CLIENT_RESULT_CACHE_STATS$:

Stores cache settings and memory usage statistics for the client result caches obtained from the OCI client processes. This statistics table has entries for each client process that is using result caching. After the client processes terminate, the database removes their entries from this table.
13 ноя 17, 09:34    [20948031]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
Shtock
Member

Откуда: СПб
Сообщений: 2961
Я в итоге разобрался. Там не всё так грустно.
14 ноя 17, 10:56    [20951735]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5528
Shtock,

А чуть подробнее можно?
14 ноя 17, 11:33    [20951909]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
Shtock
Member

Откуда: СПб
Сообщений: 2961
ну скажем так я понял как он работает. как задействовать 2 кэша одновременно - неясно. на днях напишу приложение на яве - попробую.
14 ноя 17, 11:58    [20952074]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
Shtock
Member

Откуда: СПб
Сообщений: 2961
Если упрощённо говоря когда идут простые запросы в интервал до Invalidation lag, которые не result cache, то они приносят с собой айдишники резалтсетов которые надо инвалидировать. если же прошёл этот интервал сам драйвер идёт в оракл и просит эти айдишники. ключевое - он не перечитывает сам себя, т.е. великого overhead нет.
14 ноя 17, 11:59    [20952080]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 5992
Мне вообще не очень понятен смысл кеширования на стороне OCI драйвера

Прикрутить к приложению или банальную LRUMap из Apache Commons (лично я бы на нем остановился), или, в случае желания делать "солидно" ( TM ), EhCache, кэшь хибернайта или прочее - получиться в приложении 100% управляемый кэш для _бизнес_ данных (а не убогих селектов). Занафига мучить этим Oracle?

А то у меня подозрение, что сначала программисты с тяжелой стадией "хибернейт головного мозга" написали приложение, которое 100500 мусорных запросов генерирует, а теперь с помощью subj пытаются заставить "крокодила летать" ((((

p.s. в свое время пытался смотреть на EhCache, но для меня не подходило. Мне нужны были очень хитрые правила инвалидации кэша. Прикрутить к EhCache свои правила инвалидации, мне показалось значительно сложнее, чем взять банальный LRUMap, дописать 10-50 строк кода и сделать собственный класс кэша. И проще, и надежнее.
14 ноя 17, 16:02    [20953225]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
xtender
Member

Откуда: Мск
Сообщений: 4587
Leonid Kudryavtsev
LRUMap...hCache
как они проверяют изменения в данных? или это только для случаев, когда никаких других источников изменений нет, кроме самого приложения?
14 ноя 17, 16:07    [20953249]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
Shtock
Member

Откуда: СПб
Сообщений: 2961
>>Мне вообще не очень понятен смысл кеширования на стороне OCI драйвера

а чем оно глобально отличается от кэширования в хазелькасте? тарантуле? Ничем...
14 ноя 17, 20:26    [20954164]     Ответить | Цитировать Сообщить модератору
 Re: одновременное использование client result cache и server result cache  [new]
Shtock
Member

Откуда: СПб
Сообщений: 2961
кроме единого ядра детектиции измений, которое весьма сильное :)
14 ноя 17, 20:28    [20954174]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить