|
Интервал закрытия сеансов | ☑ | ||
---|---|---|---|---|
0
Jokerman
28.05.12
✎
09:58
|
Здравствуйте всем, подскажите плз где выставляется таймаут соединений
Скульная база, платформа 8.2, а то надоело сеансы зависают у некоторых пользователей! |
|||
1
Jokerman
28.05.12
✎
10:24
|
УПс
|
|||
2
Jokerman
28.05.12
✎
10:41
|
Нет или заезженный вопрос?
|
|||
3
Jokerman
28.05.12
✎
10:44
|
Или как отследить простой соединения
|
|||
4
fisher
28.05.12
✎
10:56
|
Кажись, нигде не выставляется. Где-то в доках описано, когда отстреливается. Вроде через пол-часа или около того.
Не отследить никак, вроде... |
|||
5
fisher
28.05.12
✎
10:58
|
Хотя, в принципе, ничего не мешает построить собственный менеджер соединений.
Типа каждый клиент будет отписываться на сервер по обработке ожидания и проштрафившихся сервер будет килять через менеджер кластера. |
|||
6
Jokerman
28.05.12
✎
11:01
|
(5) а по какому свойству соединения можно узнать проштрафившихся?
|
|||
7
Jokerman
28.05.12
✎
11:02
|
Такое прочитал в СП:
dbProcTookAt Тип: Дата. Момент последнего захвата соединения с сервером баз данных. |
|||
8
fisher
28.05.12
✎
11:04
|
(7) Если это то что нужно (а похоже на то), то прикольно. Буду знать. Все равно ведь пробовать будешь - отпишись по результатам.
|
|||
9
fisher
28.05.12
✎
11:07
|
Наверное, именно эту хрень показывает как "Последнюю активность" пользователя. ИМХО, вполне можно на неё завязаться.
|
|||
10
Jokerman
28.05.12
✎
11:09
|
Хорошо посмотрим, отпишусь как попробую
|
|||
11
experimentator76
28.05.12
✎
11:44
|
LastActiveAt работает хорошо для веб-клиента (и тонкого?)
для толстого работает что-то ниже = 0 если за 5 минут не было вызовов СУБД durationLast5Min durationLast5MinDBMS |
|||
12
experimentator76
28.05.12
✎
11:47
|
LastActiveAt на толстом обновляется регулярно даже если пользователь не интерактивит
скорее всего обработчик ожидания воспринимается как активность клиента |
|||
13
experimentator76
28.05.12
✎
11:47
|
на тонком у меня обработчика ожидания пока нет
|
|||
14
Jokerman
13.06.12
✎
14:41
|
Кое-что накопал, кому надо
Процедура ЗавершениеРаботыНеактивныхПользователей() Экспорт ПодстрокиСтрокиСоединения = РазложитьСтрокуВМассивПодстрок(СтрокаСоединенияИнформационнойБазы(),";"); Если ПодстрокиСтрокиСоединения.Количество()> 1 и Лев(ПодстрокиСтрокиСоединения[0], 5) = "Srvr=" и Лев(ПодстрокиСтрокиСоединения[1], 4) = "Ref=" Тогда ИмяСервера = СтрЗаменить(Сред(ПодстрокиСтрокиСоединения[0],7, СтрДлина(ПодстрокиСтрокиСоединения[0]) - 7),":",Символы.ПС); ИмяБазы = Сред(ПодстрокиСтрокиСоединения[1],6, СтрДлина(ПодстрокиСтрокиСоединения[1]) - 6); Порт = СтрПолучитьСтроку(ИмяСервера,2); Порт = Лев(Порт,СтрДлина(Порт)-1)+"0"; ИмяСервера = СтрПолучитьСтроку(ИмяСервера,1); Попытка Коннектор = Новый COMОбъект("V82.COMConnector"); Агент = Коннектор.ConnectAgent(ИмяСервера+?(Порт="","",":"+Порт)); Кластеры = Агент.GetClusters(); Для каждого Кластер из Кластеры Цикл АдминистраторКластера = ""; ПарольКластера = ""; Агент.Authenticate(Кластер, АдминистраторКластера, ПарольКластера); Процессы = Агент.GetWorkingProcesses(Кластер); Для каждого Процесс из Процессы Цикл Порт = Процесс.MainPort; // теперь есть адрес и порт для подключения к рабочему процессу РабПроц = Коннектор.ConnectWorkingProcess(ИмяСервера + ":" + СтрЗаменить(Порт, Символы.НПП, "")); РабПроц.AddAuthentication("Администратор", ""); ИнформационнаяБаза = ""; Базы = Агент.GetInfoBases(Кластер); Для каждого База из Базы Цикл Если База.Name = ИмяБазы Тогда ИнформационнаяБаза = База; Прервать; КонецЕсли; КонецЦикла; Если ИнформационнаяБаза = "" Тогда // база не найдена КонецЕсли; Сеансы = Агент.GetInfoBaseSessions(Кластер, ИнформационнаяБаза); Для каждого Сеанс из Сеансы Цикл Если нРег(Сеанс.AppID) = "backgroundjob" ИЛИ нРег(Сеанс.AppID) = "designer" ИЛИ нРег(Сеанс.AppID) = "comconsole" Тогда // если это сеансы конфигуратора или фонового задания, то не отключаем Продолжить; КонецЕсли; Если Сеанс.userName = ИмяПользователя() Тогда // это текущий пользователь Продолжить; КонецЕсли; //Сообщить(ТекущаяДата()-Сеанс.dbProcTookAt); //здесь не заполняется dbProcTookAt, поэтому отключил это //Агент.TerminateSession(Кластер, Сеанс); КонецЦикла; ИнформационнаяБаза2 = РабПроц.CreateInfoBaseInfo(); ИнформационнаяБаза2.Name = ИмяБазы; СоединенияБазы = РабПроц.GetInfoBaseConnections(ИнформационнаяБаза2); // Разорвать соединения клиентских приложений. Для Каждого Соединение Из СоединенияБазы Цикл Если нРег(Соединение.AppID) = "backgroundjob" ИЛИ нРег(Соединение.AppID) = "designer" ИЛИ нРег(Соединение.AppID) = "comconsole" Тогда // если это соединение конфигуратора или фонового задания, то не отключаем Продолжить; КонецЕсли; Если Соединение.UserName = ИмяПользователя() Тогда // это текущий пользователь Продолжить; КонецЕсли; Осталось = 120-(ТекущаяДата()-Соединение.dbProcTookAt); //здесь 120 это 2 минуты это так для примера, можно свою константу Сообщить(Осталось); Если Осталось<=0 Тогда РабПроц.Disconnect(Соединение); КонецЕсли; КонецЦикла; КонецЦикла; КонецЦикла; Исключение СообщитьОбОшибке(ОписаниеОшибки()); КонецПопытки; КонецЕсли; КонецПроцедуры |
|||
15
Jokerman
13.06.12
✎
14:43
|
У меня другой вопрос: как посылать пользователям сообщения, предупреждения? Через WScript.Shell не получилось!
|
|||
16
Jokerman
13.06.12
✎
14:52
|
Апа
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |