#c_sharp #net #sql_server #clr
Допустим, есть CLR функция, которая имеет статический словарь, где сохраняется некоторый кеш.
Наблюдая с кешем, я заметил, что он живет не в рамках выполнения запроса, а вообще
глобально => другие запросы из других сессий могут с ним работать.
На мой взгляд, актуализировать такой кеш очень тяжело и опасно, так как весь сервер
может с ним работать=> нельзя найти подходящий момент для его актуализации.
Так же при обновлении кеша возможно, что часть запроса выполнится с одними данными,
а другая с другими, что не верно.
Можно ли добиться того, что бы каждый запрос имел собственных кеш?
Коротко о моей функции
Моя функция принимает на вход некоторый веб ресурс и парсит его путь.
Затем, получает название сервера и его IP и позже добавляет эти данные в кеш, который
представлен в виде словаря с конкуренцией.
При повторной встречи этого же ресурса, он берется из кеша, а вычисляется. Если ресурса
не существует, то выводятся спец. данные.
А теперь представим ситуацию:
Выполняется запрос и кеширует данные-все хорошо.
Затем какой-то ресурс перестает существовать.
Запускаем новый запрос и ресурс берется из кеша, как валидный, что неправильно.
Хотелось бы иметь актуальность кеша в момент запуска и изолированный от других запросов.
Ответы
Ответ 1
Думаю если очень хочется, то придется этот функционал написать самостоятельно. Идея в том, что запросы в одной сессии SQL не могут выполняться параллельно: Во время выполнения передавать в функцию CLR @@SPID и хранить кэши для каждого @@SPID После и/или перед выполнением запроса очищать кэш для данного @@SPID (или отдельной функцией или спец. параметром) P.S. Я не думаю, что идея кэша в CLR правильная. Можно, например, предварительно группировать данные в T-SQL по ресурсам или названиям серверов и уже потом проводить вычисления в CLR. Тогда не будет повторяющихся данных и кэш не нужен.
Комментариев нет:
Отправить комментарий