Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Альтернатива для [sys].[sysprocesses].[context_info] ?  [new]
RubinDm
Member

Откуда:
Сообщений: 461
Мое приложение и серверный код используют [sys].[sysprocesses].[context_info] в качестве контейнера, в котором в бинарном виде упакованы какие-то данные, например, идентификатор сессии web-приложения, открывшего данное подключение к серверу. В любой момент бизнес-логика на сервере может вычислить записанный таким образом контекст по @@spid'у. Принципиально важным нюансом является то, что на такой контекст завязано много фильтров в представлениях, процедурах, функциях и (!!!) в CLR-коде. Вопрос: а не поторопился ли я с выбором способа реализации механизма хранения идентификатора сессии? Возможно, есть иные, более простые и дешевые способы "расшаривания" контекстных данных с привязкой к @@spid'у? И еще... чтобы выполнить запрос к [sysprocesses] из CLR-кода, мне приходится открывать новое подключение к серверу, аля var sqlConnection = new SqlConnection("context connection=true"); Хотелось бы понять, какова реальная стоимость таких вызовов? ибо их (CLR-вызовов) реально много, и ни один из них не обходится без вычисления идентификатора сессии из контекста по @spid'у.
Спасибо.
20 дек 13, 05:06    [15321069]     Ответить | Цитировать Сообщить модератору
 Re: Альтернатива для [sys].[sysprocesses].[context_info] ?  [new]
Jaffar
Member

Откуда:
Сообщений: 633
RubinDm
Мое приложение и серверный код используют [sys].[sysprocesses].[context_info] в качестве контейнера, в котором в бинарном виде упакованы какие-то данные, например, идентификатор сессии web-приложения, открывшего данное подключение к серверу. В любой момент бизнес-логика на сервере может вычислить записанный таким образом контекст по @@spid'у. Принципиально важным нюансом является то, что на такой контекст завязано много фильтров в представлениях, процедурах, функциях и (!!!) в CLR-коде. Вопрос: а не поторопился ли я с выбором способа реализации механизма хранения идентификатора сессии? Возможно, есть иные, более простые и дешевые способы "расшаривания" контекстных данных с привязкой к @@spid'у? И еще... чтобы выполнить запрос к [sysprocesses] из CLR-кода, мне приходится открывать новое подключение к серверу, аля var sqlConnection = new SqlConnection("context connection=true"); Хотелось бы понять, какова реальная стоимость таких вызовов? ибо их (CLR-вызовов) реально много, и ни один из них не обходится без вычисления идентификатора сессии из контекста по @spid'у.
Спасибо.



можно сделать так:
создайте свою табличку в которой хранить поле context_info и его распарсенные значения.
при нужде смотреть если context_info из вашей таблички равен context_info из sys.sysprocesses - то брать распарсенные значения иначе переразбирать и сохранять. - это позволит свести операцию разархивации и парса - к простому сравнению свух строк binary(128)

create table my_sysproc(
spid int,
context_info,
ParseVal_1,
ParseVal_2,
ParseVal_3,
... )
20 дек 13, 07:37    [15321155]     Ответить | Цитировать Сообщить модератору
 Re: Альтернатива для [sys].[sysprocesses].[context_info] ?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
RubinDm
Вопрос: а не поторопился ли я с выбором способа реализации механизма хранения идентификатора сессии? Возможно, есть иные, более простые и дешевые способы "расшаривания" контекстных данных с привязкой к @@spid'у?
Не поторопились, отличный вариант.

RubinDm
чтобы выполнить запрос к [sysprocesses] из CLR-кода, мне приходится открывать новое подключение к серверу, аля var sqlConnection = new SqlConnection("context connection=true"); Хотелось бы понять, какова реальная стоимость таких вызовов?
Само создание коннекта бесплатное, так как он не создаётся (и даже не берётся из пула), а всего лишь получает текущий.
20 дек 13, 08:45    [15321261]     Ответить | Цитировать Сообщить модератору
 Re: Альтернатива для [sys].[sysprocesses].[context_info] ?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Jaffar
это позволит свести операцию разархивации и парса - к простому сравнению свух строк binary(128)
Думаю, что дополнительное обращение к табличке будет дороже парса. Что такое парс, это же простейшее выковыривание байтов из строки varbinary. Парс всех параметров сводится к одному запросу к context_info и получению подстрок, конвертаией и заполнением переменных с распарсенными значениями.
20 дек 13, 08:48    [15321269]     Ответить | Цитировать Сообщить модератору
 Re: Альтернатива для [sys].[sysprocesses].[context_info] ?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Может проблема в том что неправильно выбраны места применения CONTEXT_INFO()
И какого фига он нужен в CLR?
Может данные должны быть отфильтрованы до CLR или банально подан как параметр в эту CLR.
Т.е. размазывать и пихать CONTEXT_INFO() во все щели - плохой подход.
23 дек 13, 04:30    [15331717]     Ответить | Цитировать Сообщить модератору
 Re: Альтернатива для [sys].[sysprocesses].[context_info] ?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Mnior
И какого фига он нужен в CLR?
Может данные должны быть отфильтрованы до CLR или банально подан как параметр в эту CLR.
В общем да. Уж по крайней мере специально делать для этих коннект и получать CONTEXT_INFO() точно не надо.
23 дек 13, 09:46    [15332056]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить