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