Запрос SQL
-
11-10-2019 - |
Вопрос
У меня есть ферма серверов, каждый сервер регулярно делает идентичный запрос в базе данных. Эти результаты запроса кэшируются в общем кэше, доступный для всех серверов.
Как я могу гарантировать, что новый запрос не будет перезаписан более старым запросом? Существует ли способ разглаговать запросы как -то, например, к тому времени, чтобы этого не произошло? Как справиться с параллельными запросами?
Спасибо!
РЕДАКТИРОВАТЬ: DB - SQL Server. Запрос - это оператор SELECT. И механизм кэширования очень прост: простая запись, без блокировки. И это потому, что в настоящее время нет способа указать порядок избранных запросов.
Решение
Один из подходов заключается в том, чтобы иметь глобальный счетчик обновлений в базе данных, либо для обновлений, либо для чтения (обновления более эффективны, но также сложнее получить правильно).
Таким образом, в каждом обновлении также увеличивает глобальный счетчик. На каждом чтении прочитайте глобальный счетчик и поместите данные в кэш вместе со значением счетчика. Перезапись содержимое кэша, если значение счетчика больше.
Из -за изоляции базы данных транзакции должны появляться так, как будто они произошли последовательными способами (при условии, что вы выбрали сериализуемый уровень изоляции). Это, в свою очередь, будет означать, что строго более высокие цифры счетчика связаны с более поздними данными.
Другие советы
Где кеш? Это файл диска? Или таблица в базе данных?
И что это значит, когда вы говорите, что более старый запрос может перезаписать более новый? Разве это не правда, что наиболее заполненный запрос (или, может быть, самый начальный)-самый новый?
Вы должны заблокировать контейнер кеша перед выполнением каждого запроса, будь то файл или таблица. Каждый сервер должен выполнить запрос только в том случае, если он может получить блокировку, в противном случае он должен ждать заблокированного ресурса. Таким образом, кэш будет содержать только самые последние результаты.
Это вроде того, что вы спрашиваете?