Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Эмуляция монопольного режима  [new]
orunbek
Member

Откуда: Гималай
Сообщений: 2101
Доброго времени суток!
Есть база на SQL Server 2008 R2, клиент написан на VB6, с использованием ADO.
Клиентская прога к базе подключается через один логин, сессии, пользователи и т.д. регулируются на логическом уровне, т.е. на уровне клиентского приложения.
Необходимо было некоторые операции провести через монопольный режим, и начал рассматривать варианты решения данной проблемы.
Поначалу монопольный режим собирался реализовывать через перевод базы в режим SINGLE_USER.
Но из-за создания ADO дополнительных подключений (тема №1, тема №2) не получилось использовать такой режим.
Потом думал еще про контроль сессий через sp_who и т.д. Но из-за пулинга подключений возникла сложность определения дествительно активных и "ожидающих" подключений.
Сейчас рассматриваю вариант CONTEXT_INFO таблицы sys.dm_exec_sessions.
Т.е. в хранимке авторизации пользователя устанавливается CONTEXT_INFO, к примеру следующим образом:
DECLARE @SessionContext varbinary(128)
SET @SessionContext = CAST(@DBName+CAST(@Session_ID AS char(20)) AS varbinary(128))

а в хранимке закрытии сессии сбрасывается CONTEXT_INFO
и чтобы определить есть ли другие активные клиентские подключения проверяю таблицу sys.dm_exec_sessions.
И в принципе все работает как надо. Единственное есть вопрос, в случае когда клиентское приложение откидывается из-за программного или технического сбоя, сбрасывается ли запись в sys.dm_exec_sessions или как?
В хелпе написано
Returns one row per authenticated session on SQL Server. sys.dm_exec_sessions is a server-scope view that shows information about all active user connections and internal tasks

Т.е. если происходит дисконнект запись должна удалится?
Проверял практически, так и происходит, но решил "выложить" на суд идею реализации эмуляции монопольного режима.
Сразу скажу что проверка подключений не через клиентскую программу не нужна.
Спасибо за внимание.
11 май 11, 20:48    [10638228]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
В общем, велосипед с квадратными колесами, да еще и не дающий гарантии монопольности.
Вариант:
В процедуре аутентификации пользователя с помощью sp_getapplock ставится shared блокировка уровня сессии на общий ресурс. Когда надо обеспечить монопольность, делается попытка поставить exclusive блокировку уровня сессии на этот же ресурс.
11 май 11, 23:14    [10638736]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
iljy
Member

Откуда:
Сообщений: 8711
orunbek,

зачем все это вообще нужно? Смысл в этих танцах какой?
11 май 11, 23:25    [10638771]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
orunbek
Member

Откуда: Гималай
Сообщений: 2101
invm
В общем, велосипед с квадратными колесами, да еще и не дающий гарантии монопольности.
Вариант:
В процедуре аутентификации пользователя с помощью sp_getapplock ставится shared блокировка уровня сессии на общий ресурс. Когда надо обеспечить монопольность, делается попытка поставить exclusive блокировку уровня сессии на этот же ресурс.

понимаю, может быть даже треугольные колеса,
но говорю же, что когда на VB работаю с базой через ADO, создаются дополнительные подключения
из-за чего и
ставится shared блокировка уровня сессии на общий ресурс

не прокатывает, если, не то бы реализовал бы все через SINGLE USER режим,
вот в этой теме я предварительно уже обсуждал

iljy
orunbek,

зачем все это вообще нужно? Смысл в этих танцах какой?

скажем чтобы операционный день поменять, мм... глобальные настройки изменить, при изменении которых, должен быть подключен только один пользователь
12 май 11, 05:42    [10639198]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
orunbek
Member

Откуда: Гималай
Сообщений: 2101
invm
В общем, велосипед с квадратными колесами, да еще и не дающий гарантии монопольности.
...
...


Если учитывать авторизации только с приложения через определенную хранимку, которая обязательно устанавливает значение CONTEXT_INFO
Но все сессии созданные клиентским приложением обязательно будут иметь это значение
12 май 11, 06:16    [10639209]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
trayal
Member

Откуда: Пенза
Сообщений: 471
Подобную задачу решал через создание глобальной временной таблицы.
Факт существования таблицы означал наличие подключения.
Дополнительно в полях таблицы прописывал сведения о приложении, осуществляющем "монопольный" режим.
12 май 11, 10:05    [10639609]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
orunbek
понимаю, может быть даже треугольные колеса,
но говорю же, что когда на VB работаю с базой через ADO, создаются дополнительные подключения

Во-первых, можно запретить пулинг подключений, во-вторых можно задействовать триггер на logon.
Еще раз -- ваш способ не гарантирует монопольности.
12 май 11, 10:28    [10639737]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
iljy
Member

Откуда:
Сообщений: 8711
invm,

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

orunbek,

вам что в итоге нужно? Выполнить над базой некоторые административные действия в монопольном режиме? А вынести их в процедуру и запустить ее в SINGLE_USER не? Или вам интерактивность нужна? А что будете делать с уже подключенными пользователями в таком случае?

Вообще вам никто не может помешать сделать отдельное подключение и в нем захватить какой-нибудь ресурс, например sp_getapplock тот же. Или таблицу постоянную пустую сделать. Дальше в пользовательском режиме проверяете его доступность, а в административном - нет. Как закончили работу администратора - ресурс разблокировали.
12 май 11, 10:41    [10639816]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
orunbek
Member

Откуда: Гималай
Сообщений: 2101
invm
orunbek
понимаю, может быть даже треугольные колеса,
но говорю же, что когда на VB работаю с базой через ADO, создаются дополнительные подключения

Во-первых, можно запретить пулинг подключений, во-вторых можно задействовать триггер на logon.
Еще раз -- ваш способ не гарантирует монопольности.


Ммм... уточню, мой способ гарантирует монопольный доступ по одному приложению, который подключаются по строго указанному способу
Пулинг подключений нельзя отключить, работают другие приложения, которыми пулинг нужен
Про триггер logon понятно, но как в случае разрыва подключения с сервером?

iljy
invm,

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

orunbek,

вам что в итоге нужно? Выполнить над базой некоторые административные действия в монопольном режиме? А вынести их в процедуру и запустить ее в SINGLE_USER не? Или вам интерактивность нужна? А что будете делать с уже подключенными пользователями в таком случае?

Вообще вам никто не может помешать сделать отдельное подключение и в нем захватить какой-нибудь ресурс, например sp_getapplock тот же. Или таблицу постоянную пустую сделать. Дальше в пользовательском режиме проверяете его доступность, а в административном - нет. Как закончили работу администратора - ресурс разблокировали.


Там может быть "куча действий", и при этом все действия совершаются через клиентскую прогу, данные операции достаточно накладно будет вывести в хранимку, и как вы сами уже сказли интерактивность тоже есть
Перед тем как открыть эту форму, требующую монополию, программа проверяют через sys.dm_exec_sessions.CONTEXT_INFO сущетсование других подключений, если они есть, нельзя будет открыть эту форму.
Конечно про отдельное подключение тоже думал, но не хотел память грузить дополнительным экземпляром ADODB.Connection
12 май 11, 11:23    [10640178]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
iljy,

Почему же не при чем? ЕМНИП, пул соединений начинает работать, если на клиенте есть недофетченные наборы. Или мы о разном пулинге говорим? Я имел в виду OLEDB.

orunbek,

Ваш способ не дает гарантий даже по одному приложению. Пулинг работает на стороне клиента и не имеет отношения к серверу. Так что другие приложения тут не причем. Кстати, совершенно непонятно как вы обходите пулинг, если
orunbek
Сейчас рассматриваю вариант CONTEXT_INFO таблицы sys.dm_exec_sessions.
Т.е. в хранимке авторизации пользователя устанавливается CONTEXT_INFO, к примеру следующим образом:
DECLARE @SessionContext varbinary(128)
SET @SessionContext = CAST(@DBName+CAST(@Session_ID AS char(20)) AS varbinary(128))

Как обеспечиваете вызов данной процедуры во всех соединениях?
12 май 11, 12:36    [10640786]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
iljy
Member

Откуда:
Сообщений: 8711
invm,

пул соединений - это соединения, которые вы в программе закрыли. Много их возникает, если каждый рекордсет выбирается через собственное соединение например. Тогда провайдер не будет реально их закрывать сразу, а будет откладывать до "а вдруг еще понадобятся".

orunbek,

если уж у вас плотно задействован пул, то жалеть еще одно соединение как-то даже неудобно И в этом случае захват sp_getapplock вполне для вас подойдет - административное подключение не сможет захватить шару единолично, если есть хоть одно обычное соединение.
12 май 11, 12:52    [10640922]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
orunbek
Member

Откуда: Гималай
Сообщений: 2101
invm
iljy,

Почему же не при чем? ЕМНИП, пул соединений начинает работать, если на клиенте есть недофетченные наборы. Или мы о разном пулинге говорим? Я имел в виду OLEDB.

orunbek,

Ваш способ не дает гарантий даже по одному приложению. Пулинг работает на стороне клиента и не имеет отношения к серверу. Так что другие приложения тут не причем. Кстати, совершенно непонятно как вы обходите пулинг, если
orunbek
Сейчас рассматриваю вариант CONTEXT_INFO таблицы sys.dm_exec_sessions.
Т.е. в хранимке авторизации пользователя устанавливается CONTEXT_INFO, к примеру следующим образом:
DECLARE @SessionContext varbinary(128)
SET @SessionContext = CAST(@DBName+CAST(@Session_ID AS char(20)) AS varbinary(128))

Как обеспечиваете вызов данной процедуры во всех соединениях?

Данная процедура вызывается в коде хранимки авторизации
И очищается при закрытии сессии, этот метод опробовал уже и работает
А про пул я говорил не пойдет в плане определения наличия других подключенных клиентских приложений
Т.е. через sysprocesses (точное наименование таблицы не помню, но можно посмотреть), если даже приложение закрыто, пул то оставляет
я предварительно проверял

iljy
invm,

пул соединений - это соединения, которые вы в программе закрыли. Много их возникает, если каждый рекордсет выбирается через собственное соединение например. Тогда провайдер не будет реально их закрывать сразу, а будет откладывать до "а вдруг еще понадобятся".

orunbek,

если уж у вас плотно задействован пул, то жалеть еще одно соединение как-то даже неудобно И в этом случае захват sp_getapplock вполне для вас подойдет - административное подключение не сможет захватить шару единолично, если есть хоть одно обычное соединение.


вот про sp_getapplock я не пробовал, ща попробую этот метод
12 май 11, 13:37    [10641234]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
iljy
invm,

пул соединений - это соединения, которые вы в программе закрыли. Много их возникает, если каждый рекордсет выбирается через собственное соединение например. Тогда провайдер не будет реально их закрывать сразу, а будет откладывать до "а вдруг еще понадобятся".

Это как раз понятно -- оптимизация затрат на установку соединенеия. Я про другой случай -- если в OLEDB клиент использует клиентский курсор и в коннекте остались недофетченные данные, то, при попытке выполнить следующую команду, в случае, если для этого коннекта разрешен пулинг, эта команда будет выполнена в новом соединении.

orunbek
А про пул я говорил не пойдет в плане определения наличия других подключенных клиентских приложений
Т.е. через sysprocesses (точное наименование таблицы не помню, но можно посмотреть), если даже приложение закрыто, пул то оставляет
я предварительно проверял

Что-то очень туманно. Что и кто оставляет пул, если приложение закрыто? А вариант с sp_getapplock я вам в самом начале предложил.
12 май 11, 14:40    [10641797]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
orunbek
Member

Откуда: Гималай
Сообщений: 2101
iljy
....
....
....
если уж у вас плотно задействован пул, то жалеть еще одно соединение как-то даже неудобно И в этом случае захват sp_getapplock вполне для вас подойдет - административное подключение не сможет захватить шару единолично, если есть хоть одно обычное соединение.


млин, опять не катит, из-за того что при вызове хранимки для вызова sp_getapplock ADO создает новое подключение
и соотвественно после завершения работы хранимки ресурс освобождается
12 май 11, 14:42    [10641810]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
iljy
Member

Откуда:
Сообщений: 8711
orunbek
iljy
....
....
....
если уж у вас плотно задействован пул, то жалеть еще одно соединение как-то даже неудобно И в этом случае захват sp_getapplock вполне для вас подойдет - административное подключение не сможет захватить шару единолично, если есть хоть одно обычное соединение.


млин, опять не катит, из-за того что при вызове хранимки для вызова sp_getapplock ADO создает новое подключение
и соотвественно после завершения работы хранимки ресурс освобождается

Кто чего опять создает?? Создайте подключение сами, откройте, выполните в нем команду и не трогайте его больше - оно будет тихо-спокойно висеть, пока вы его не закроете или не уничтожите объект.
12 май 11, 14:44    [10641842]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
orunbek,

Либо, как написал iljy, создайте служебное соединение исключительно для выполнения sp_getapplock, либо, если вам в приложении не требуются недофетченные наборы, откажитесь от пулинга путем указание в строке соединения параметра 'OLE DB Services=-2'
12 май 11, 15:57    [10642568]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
orunbek
Member

Откуда: Гималай
Сообщений: 2101
iljy,

при работе с SQL Server через ADO создаются скрыто другие подключения к базе
про это я и говорю

invm,

кажись мне нужно либо использовать "недо монопольный режим" через CONTEXT_INFO, либо пулинг отключать
служебное подключение не могу сделать потому что интерактивность требуется
12 май 11, 17:26    [10643299]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
orunbek
iljy,

при работе с SQL Server через ADO создаются скрыто другие подключения к базе
про это я и говорю

invm,

кажись мне нужно либо использовать "недо монопольный режим" через CONTEXT_INFO, либо пулинг отключать
служебное подключение не могу сделать потому что интерактивность требуется

Вы прямо какими-то загадками изъясняетесь. Что за интерактивность, которая мешает создать подключение к серверу?
12 май 11, 17:45    [10643468]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
ТС явно партизанит, совсем не понятно зачем ему какой-то монопольный режим, почему у него якобы через ADODB какие-то левые соединения. Пусть раскажет на пальцах архитектуру своего решения, может там что в консерватории надо что-нибудь поправить.
12 май 11, 17:49    [10643507]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
iljy
Member

Откуда:
Сообщений: 8711
orunbek
при работе с SQL Server через ADO создаются скрыто другие подключения к базе

ADO никаких подключений скрыто не создает. Единственная ситуация, когда появляется неявное соединение, это открытие ADORecordset или ADOCommand без явного указания активного существующего соединения, тогда да, оно будет создано неявно. Если вы так написали программу, что у вас подобная ситуевина сплошь и рядом- сами себе буратины.
И от пулинга отстаньте, пулинг начинает работать, когда уничтожается явный или неявный объект Connection, тогда провайдер может временно не закрывать соединение с сервером, а поместить его в буфер для повторного использования.
12 май 11, 18:03    [10643637]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
iljy
orunbek
при работе с SQL Server через ADO создаются скрыто другие подключения к базе

ADO никаких подключений скрыто не создает. Единственная ситуация, когда появляется неявное соединение, это открытие ADORecordset или ADOCommand без явного указания активного существующего соединения, тогда да, оно будет создано неявно.
При асинхронных операциях еще делает. Вроде. Не помню уже точно.
12 май 11, 18:05    [10643652]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
iljy
Member

Откуда:
Сообщений: 8711
Гавриленко Сергей Алексеевич
iljy
пропущено...

ADO никаких подключений скрыто не создает. Единственная ситуация, когда появляется неявное соединение, это открытие ADORecordset или ADOCommand без явного указания активного существующего соединения, тогда да, оно будет создано неявно.
При асинхронных операциях еще делает. Вроде. Не помню уже точно.

... Счас тоже не помню, врать не буду. Но по-моему нет.
12 май 11, 18:07    [10643662]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
так я уже советовал ТСу профайлером отловить свои клиентские коннекты, он сказал, что это сложно и долго. теперь мучается с непонятными сессиями на T-SQL
12 май 11, 18:08    [10643667]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
orunbek
Member

Откуда: Гималай
Сообщений: 2101
Konst_One
так я уже советовал ТСу профайлером отловить свои клиентские коннекты, он сказал, что это сложно и долго. теперь мучается с непонятными сессиями на T-SQL


просто раньше тоже с этой проблемой сталкивался, искал в зарубежных форумах и не смог найти решение
видимо ща тока это и остается, "ловить" коннекты
12 май 11, 19:21    [10643992]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция монопольного режима  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
iljy
Единственная ситуация, когда появляется неявное соединение, это открытие ADORecordset или ADOCommand без явного указания активного существующего соединения, тогда да, оно будет создано неявно.

Я невеликий знаток ADO, но этот момент мне непонятен. Соединение к какому серверу и БД будет неявно создано? Где-то в ADO можно задавать дефолтную строку соединения?
12 май 11, 20:24    [10644140]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить