Страницы

Поиск по вопросам

среда, 11 декабря 2019 г.

Кеширование данных в SQL CLR функции

#c_sharp #net #sql_server #clr


Допустим, есть CLR функция, которая имеет статический словарь, где сохраняется некоторый кеш.

Наблюдая с кешем, я заметил, что он живет не в рамках выполнения запроса, а вообще
глобально => другие запросы из других сессий могут с ним работать.

На мой взгляд, актуализировать такой кеш очень тяжело и опасно, так как весь сервер
может с ним работать=> нельзя найти подходящий момент для его актуализации.

Так же при обновлении кеша возможно, что часть запроса выполнится с одними данными,
а другая с другими, что не верно.

Можно ли добиться того, что бы каждый запрос имел собственных кеш?

Коротко о моей функции

Моя функция принимает на вход некоторый веб ресурс и парсит его путь.
Затем, получает название сервера и его IP и позже добавляет эти данные в кеш, который
представлен в виде словаря с конкуренцией.
При повторной встречи этого же ресурса, он берется из кеша, а вычисляется. Если ресурса
не существует, то выводятся спец. данные.

А теперь представим ситуацию:

Выполняется запрос и кеширует данные-все хорошо.

Затем какой-то ресурс перестает существовать.

Запускаем новый запрос и ресурс берется из кеша, как валидный, что неправильно.

Хотелось бы иметь актуальность кеша в момент запуска и изолированный от других запросов.
    


Ответы

Ответ 1



Думаю если очень хочется, то придется этот функционал написать самостоятельно. Идея в том, что запросы в одной сессии SQL не могут выполняться параллельно: Во время выполнения передавать в функцию CLR @@SPID и хранить кэши для каждого @@SPID После и/или перед выполнением запроса очищать кэш для данного @@SPID (или отдельной функцией или спец. параметром) P.S. Я не думаю, что идея кэша в CLR правильная. Можно, например, предварительно группировать данные в T-SQL по ресурсам или названиям серверов и уже потом проводить вычисления в CLR. Тогда не будет повторяющихся данных и кэш не нужен.

Комментариев нет:

Отправить комментарий