|
"выгонялка" подвисает в месте, где нужно получить соединения ИБ | ☑ | ||
---|---|---|---|---|
0
GANR
02.08.11
✎
10:10
|
Имеется такая "выгонялка" пользователей:
МенеджерДС = Константы.мдмДанныеСеансов; МД_ДанныеСеансов = Метаданные.Константы.мдмДанныеСеансов; МД_РегламентноеЗадание = Метаданные.РегламентныеЗадания.мдмОбновлениеСтатистикиПодключений; МенеджерДС = Константы.мдмДанныеСеансов; ДанныеСеансов = МенеджерДС.Получить().Получить(); ВсеПятиминуткиСеансов = Неопределено; СинхронизацияНачалаСеансов = Неопределено; ВсеПятиминуткиСеансовСервер = Неопределено; Если ТипЗнч(ДанныеСеансов) <> Тип("Структура") Тогда ДанныеСеансов = Новый Структура("ВсеПятиминуткиСеансов, ВсеПятиминуткиСеансовСервер, СинхронизацияНачалаСеансов"); КонецЕсли; ДанныеСеансов.Свойство("ВсеПятиминуткиСеансов", ВсеПятиминуткиСеансов); Если Не ЗначениеЗаполнено(ВсеПятиминуткиСеансов) Тогда ВсеПятиминуткиСеансов = Новый Массив; КонецЕсли; ДанныеСеансов.Свойство("ВсеПятиминуткиСеансовСервер", ВсеПятиминуткиСеансовСервер); Если Не ЗначениеЗаполнено(ВсеПятиминуткиСеансовСервер) Тогда ВсеПятиминуткиСеансовСервер = Новый Массив; КонецЕсли; ДанныеСеансов.Свойство("СинхронизацияНачалаСеансов", СинхронизацияНачалаСеансов); Если Не ЗначениеЗаполнено(СинхронизацияНачалаСеансов) Тогда СинхронизацияНачалаСеансов = Новый Соответствие; КонецЕсли; СинхронизацияНачалаСеансов.Очистить(); КоличествоПятиминутокПростоя = Константы.мдмКоличествоПятиминутокПростоя.Получить(); КоличествоПятиминутокПростоя = ?(ЗначениеЗаполнено(КоличествоПятиминутокПростоя), КоличествоПятиминутокПростоя, 2); КоличествоПятиминутокПростояСервер = Константы.мдмКоличествоПятиминутокПростояСервер.Получить(); КоличествоПятиминутокПростояСервер = ?(ЗначениеЗаполнено(КоличествоПятиминутокПростояСервер), КоличествоПятиминутокПростоя, 3); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | IT_ВИБ.Кластер КАК Кластер, | IT_ВИБ.КорневойУзелИБ.ИмяБазыДанных КАК База, | IT_ВИБ.ПодключениеПоУмолчанию.Пользователь КАК ПользовательБазы, | IT_ВИБ.ОтключениеПоУмолчанию.Пользователь КАК ПользовательОтключение, | IT_ВИБ.ОтключениеПоУмолчанию.Пароль КАК ПарольОтключение, | IT_ВИБ.КорневойУзелИБ.ПерекличекЗа5Минут КАК ПерекличекЗа5Минут, | IT_ВИБ.Кластер.ПодключениеПоУмолчанию.Пользователь КАК ПользовательКластер, | IT_ВИБ.Кластер.ПодключениеПоУмолчанию.Пароль КАК ПарольКластер, | IT_ВИБ.Кластер.ИмяСервера КАК ИмяСервераКластер, | IT_ВИБ.Кластер.Порт КАК ПортКластер |ИЗ | Справочник.IT_ВнешниеИнформационныеБазы КАК IT_ВИБ |ГДЕ | IT_ВИБ.ПодключениеПоУмолчанию <> ЗНАЧЕНИЕ(Справочник.IT_ПодключенияКВИБ.ПустаяСсылка) | И IT_ВИБ.ОтключениеПоУмолчанию <> ЗНАЧЕНИЕ(Справочник.IT_ПодключенияКВИБ.ПустаяСсылка) | И IT_ВИБ.КорневойУзелИБ <> ЗНАЧЕНИЕ(Справочник.IT_УзлыИБ.ПустаяСсылка) | И IT_ВИБ.КорневойУзелИБ.СерверныйРежим = 0 | И IT_ВИБ.Кластер <> ЗНАЧЕНИЕ(Справочник.IT_Оборудование.ПустаяСсылка) | И IT_ВИБ.Кластер.ПодключениеПоУмолчанию <> ЗНАЧЕНИЕ(Справочник.IT_ПодключенияКВИБ.ПустаяСсылка) |ИТОГИ ПО | Кластер"; Результат = Запрос.Выполнить(); ВыборкаКластер = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); //НаборСвойств = "AppID, ConnID, ConnectedAt, DBConnMode, HostName, IBConnMode, blockedByDBMS, bytesAll, bytesLast5Min, callsAll, callsLast5Min, //|dbProcInfo, dbProcTook, dbProcTookAt, dbmsBytesAll, dbmsBytesLast5Min, durationAll, durationAllDBMS, durationCurrent, durationCurrentDBMS, durationLast5Min, //|durationLast5MinDBMS, userName"; СтруктураСоединения = Новый Структура("ConnID, callsLast5Min"); ПоследняяПятиминутка = Новый Массив; Коннектор = Новый COMОбъект("v82.COMConnector"); Пока ВыборкаКластер.Следующий() Цикл СерверКластер = СокрЛП(ВыборкаКластер.ИмяСервераКластер); ПортКластер = СокрЛП(ВыборкаКластер.ПортКластер); ПользовательКластер = СокрЛП(ВыборкаКластер.ПользовательКластер); ПарольКластер = СокрЛП(ВыборкаКластер.ПарольКластер); ЗаписьЖурналаРегистрации("Обновление статистики активности сеансов", УровеньЖурналаРегистрации.Информация, МД_РегламентноеЗадание, , "Просмотр кластера " + СерверКластер + ":" + ПортКластер) ; Агент = Коннектор.ConnectAgent(СерверКластер + ":" + ПортКластер); Кластеры = Агент.GetClusters(); Для Каждого Кластер Из Кластеры Цикл // получим и переберем процессы кластера Агент.Authenticate(Кластер, ПользовательКластер, ПарольКластер); Процессы = Агент.GetWorkingProcesses(Кластер); Для Каждого Процесс Из Процессы Цикл Если Процесс.MainPort = 0 Тогда Продолжить; КонецЕсли; ПортПроцесса = СтрЗаменить(СокрЛП(Процесс.MainPort), Символы.НПП, ""); Выборка = ВыборкаКластер.Выбрать(); Пока Выборка.Следующий() Цикл // теперь есть адрес и порт для подключения к рабочему процессу РабПроц = Коннектор.ConnectWorkingProcess(СерверКластер + ":" + ПортПроцесса); // логин админа кластера РабПроц.AuthenticateAdmin(ПользовательКластер, ПарольКластер); // логин админа базы РабПроц.AddAuthentication(Выборка.ПользовательОтключение, Выборка.ПарольОтключение); ИнформационнаяБаза = РабПроц.CreateInfoBaseInfo(); ИнформационнаяБаза.Name = Выборка.База; Попытка СоединенияБазы = РабПроц.GetInfoBaseConnections(ИнформационнаяБаза); Исключение ЗаписьЖурналаРегистрации("Обновление статистики активности сеансов", УровеньЖурналаРегистрации.Ошибка, МД_РегламентноеЗадание, , "Для базы " + СокрЛП(Выборка.База) + " не удалось получить подключения " + ОписаниеОшибки()); Продолжить; КонецПопытки; //Разорвать соединения клиентских приложений. Для Каждого Соединение Из СоединенияБазы Цикл Если Соединение.userName = Выборка.ПользовательБазы И Соединение.AppID = "1CV8" Тогда ConnID = Соединение.ConnID; callsLast5Min = Соединение.callsLast5Min; СинхронизацияНачалаСеансов.Вставить(Соединение.ConnID, Соединение.ConnectedAt); МинимальноеЧислоПерекличек = ?(ЗначениеЗаполнено(Выборка.ПерекличекЗа5Минут), Выборка.ПерекличекЗа5Минут, 25); СоединениеНужноОтключить = callsLast5Min <= МинимальноеЧислоПерекличек; Если СоединениеНужноОтключить = Истина Тогда ИндексДС = 0; Пока СоединениеНужноОтключить = Истина И ИндексДС <= ВсеПятиминуткиСеансовСервер.Количество() - 1 Цикл ПятиминуткаСеансов = ВсеПятиминуткиСеансовСервер[ИндексДС]; ИндексТС = 0; Пока СоединениеНужноОтключить = Истина И ИндексТС <= ПятиминуткаСеансов.Количество() - 1 Цикл СоединениеНужноОтключить = ConnID <> ПятиминуткаСеансов[ИндексТС]; ИндексТС = ИндексТС + 1; КонецЦикла; ИндексДС = ИндексДС + 1; КонецЦикла; Иначе ПоследняяПятиминутка.Добавить(ConnID); КонецЕсли; Если СоединениеНужноОтключить = Истина Тогда Попытка РабПроц.Disconnect(Соединение); ЗаписьЖурналаРегистрации("Обновление статистики активности сеансов", УровеньЖурналаРегистрации.Предупреждение, МД_РегламентноеЗадание, , "Сеанс " + ConnID + " принудительно отключен фоновым заданием"); Исключение ЗаписьЖурналаРегистрации("Обновление статистики активности сеансов", УровеньЖурналаРегистрации.Ошибка, МД_РегламентноеЗадание, , "Сеанс " + ConnID + " не удалось отключить фоновым заданием " + ОписаниеОшибки()); КонецПопытки; КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; КонецЦикла; КонецЦикла; КонецЦикла; ВсеПятиминуткиСеансов.Добавить(ПоследняяПятиминутка); Пока ВсеПятиминуткиСеансов.Количество() > КоличествоПятиминутокПростоя Цикл ВсеПятиминуткиСеансов.Удалить(0); КонецЦикла; ВсеПятиминуткиСеансовСервер.Добавить(ПоследняяПятиминутка); Пока ВсеПятиминуткиСеансовСервер.Количество() > КоличествоПятиминутокПростояСервер Цикл ВсеПятиминуткиСеансовСервер.Удалить(0); КонецЦикла; НоваяСтруктура = Новый Структура("ВсеПятиминуткиСеансов, ВсеПятиминуткиСеансовСервер, СинхронизацияНачалаСеансов", ВсеПятиминуткиСеансов, ВсеПятиминуткиСеансовСервер, СинхронизацияНачалаСеансов); МенеджерДС.Установить(Новый ХранилищеЗначения(НоваяСтруктура)); В строчке Попытка СоединенияБазы = РабПроц.GetInfoBaseConnections(ИнформационнаяБаза); Исключение ЗаписьЖурналаРегистрации("Обновление статистики активности сеансов", УровеньЖурналаРегистрации.Ошибка, МД_РегламентноеЗадание, , "Для базы " + СокрЛП(Выборка.База) + " не удалось получить подключения " + ОписаниеОшибки()); Продолжить; КонецПопытки; при попытке получить соединения одной из 8 баз (остальные нормально отрабатывает) программа останавливается в этой точке и не хочет идти дальше по многу дней :). В чем дело? |
|||
1
GANR
02.08.11
✎
10:11
|
В строчке
Попытка СоединенияБазы = РабПроц.GetInfoBaseConnections(ИнформационнаяБаза); Исключение ЗаписьЖурналаРегистрации("Обновление статистики активности сеансов", УровеньЖурналаРегистрации.Ошибка, МД_РегламентноеЗадание, , "Для базы " + СокрЛП(Выборка.База) + " не удалось получить подключения " + ОписаниеОшибки()); Продолжить; КонецПопытки; при попытке получить соединения одной из 8 баз (остальные нормально отрабатывает) программа останавливается в этой точке и не хочет идти дальше по многу дней :). В чем дело? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |