Вопрос

Логика работы TSCRM с MSSQL сервером. Узкий канал.

При тестировании работы TSCRM в регионах (каналы предачи данных в регионы предоставлены государственным интернет провайдером Белтелеком, причем каналы начиная от 192 Кбит/сек) возникли проблемы, в частности часто, при создании контакта или котрагента, после нажатия на кнопку ОК окошко остается виесть и закрыть его невозможно. Приходится снимать задачу и запускать TS CRM заново.

Причинами подобных проблем могут быть следующие:
- потери данных при обмене с регионом, например при превышении заказанной полосы "лишние" пакеты просто отбрасываются провайдером каналов.
- из-за того что канал используется не только для TS CRM возможно превышение тайм-аутов запросов к SQL серверу.

Для уточнения проблемы и поиска решения прошу пояснить логику работы TS CRM (версия и параметры указаны в подписи) с сервером и дать рекомендации.

Вопросы:

1. Как TS CRM реагирует на потерю соединения с сервером в процессе выполнения SQL запроса? Предпринимаются ли попытки ( и если да, то сколько) восстановить соединение и выполнить потерянный запрос повторно?
2. Как TS CRM реагирует на истечение тайм-аута SQL запроса к серверу MS SQL
где этот (или возможно несколько: в клиенте, на сервере, в самом ядре TS CRM)
тайм-аут хранится, как его можно посмотреть изменить, отдебажить.
3. Возможно ситуация с незакрывающимися окошками уже Вам известна и вы знаете решение.

Заранее спасибо за ответ.

Нравится

5 комментариев

Добрый день Сергей,

1. Создайте индексы в таблицах tbl_Account, tbl_Contact по полям Name,
Communication1, Communication2, Communication3, Communication4 и
Communication5.

2. В скрипте scr_BaseDBEditUtils

Замените функцию ProcessBaseDBEditOKOnClick:

function ProcessBaseDBEditOKOnClick(Window, BaseDBEdit) {
        if (!WindowWasPrepared(Window)) {
        return;
        }
        var Result = SaveChangesWithCheck(Window, BaseDBEdit);
        if (Result){
                Window.IsVisible = false;
                System.ProcessMessages();
                Window.Close();
        }
        return Result;
}

3. Таймаут при выполнении запросов - бесконечность. Изменить его извне
нельзя.

--

Осауленко Александр

Результаты тестирования прислали:

1. Менеджер 1. г.Гродно - "Субъективно стало работать лучше. Зависаний окошек нет.Обновление 3.0.4.109 Работает.Отличий не наблюдалось."

2. Менеджер 2. г. Гомель - "Новая версия работает с такой же скоростью как и описано в субботнем письме про старую версию. [Скорость работы вроде нормальная (во всяком случае намного быстрее чем в старом црме), сравнима с работай лотуса в г. Гомеле.] Но это пока я один работаю в Гомеле. Надеюсь, что после того как пользователей будет минимум 9, она не изменится."

3.Менеджер3. г. Могилев - "после обновления ошибок не возникало"

По результатам тестирования делаем вывод, что благодаря настройке DSCP на маршрутизаторах техническим отделом, а также внесенным изменениям, согласно рекомендациям специалиста компании Terrasoft выявленные в ходе первого тестирования ошибки удалось победить.

=======================================================================

P.S. Судя по предложенному коду, он только скрывает проблему, но не решает ее.
Будем надеятся что проблему решила настройка приоритезации трафика. Прошу меня поправить, если я ошибаюсь.

"Sergey E. Yakovlev" написал:P.S. Судя по предложенному коду, он только скрывает проблему, но не решает ее.
Будем надеятся что проблему решила настройка приоритезации трафика. Прошу меня поправить, если я ошибаюсь.

Здравствуйте!
Спасибо за результаты.
В коде появилась строка - System.ProcessMessages();
Она запускает цикл обработки оконных сообщений. Данный метод используется при выполнении длительных операций для избежания эффекта "заморозки" окна.
--

Осауленко Александр

А вернется ли управление из строки

     var Result = SaveChangesWithCheck(Window, BaseDBEdit);

если пакет ответа от MSSQL (например из-за сбоя в сети) простсо потеряется и никогда не придет?

"Sergey E. Yakovlev" написал:А вернется ли управление из строки

     var Result = SaveChangesWithCheck(Window, BaseDBEdit);

если пакет ответа от MSSQL (например из-за сбоя в сети) простсо потеряется и никогда не придет?


Функция System.ProcessMessages(); предназначена только для длительных операций.
Для решения проблем связанных с потерей соединения - в версии 3.0.4
не было автоматического восстановления соединения с сервером. Это появится в ближайшем билде 3.0.4
В Вашем случае могу посоветовать:
1. В скрипте scr_BaseDBEditUtils
Заменить функцию SaveChangesWithCheck

function SaveChangesWithCheck(Window, BaseDBEdit){
	try {
		var Datalink = Window.ComponentsByName('dlData');
		var Dataset = Datalink.Dataset;
		if (!CheckData(Window, BaseDBEdit, Datalink)) {
			return false;
		}
		var AddNewRecordOnPage = (Dataset.State == dstInsert);
		if (AddNewRecordOnPage &&
			GetIsDuplicatesExists(BaseDBEdit, Dataset, Window)){
			return false;
		}
		if (AddNewRecordOnPage && !GetCanInsertTableGroup(Dataset)) {
			ShowWarningDialog("Текущий пользователь не имеет достаточно прав для добавления записи");
			return false;
		} else
		if (!AddNewRecordOnPage && !GetIsCanEdit(Dataset, BaseDBEdit)) {
			ShowWarningDialog("У вас нет прав на изменение записи");
			return false;
		}
		SaveChanges(BaseDBEdit, Window);
		SendNotify(Window, MSG_OK);
		return true;
	} catch (e) {
	    System.EndProcessing();
		System.MessageDialog(e.message, mdtError, mdbOK, 0);
  		return false;
	}
}

2. В скрипте scr_Main:
Заменить функцию ShowTimerWindow

function ShowTimerWindow() {	
	try {
		Main.RemindingsForm = Connector.Attributes('RemindingsWindow');
		if (Assigned(Connector.Attributes('RemindingsWindow'))) {
			var RemindingsWindow = Connector.Attributes('RemindingsWindow');
			RefreshDataset(RemindingsWindow.ComponentsByName('dlData').Dataset);
		} else {
			if (GetAreRemindingsExist()) {
				Main.RemindingsForm =
					Services.GetNewItemByUSI(Main.RemindingsWindowUSI);
				SetAttribute(Main.RemindingsForm, 'ContactID',
					Connector.CurrentUser.ContactID);
				Main.RemindingsForm.Show();
				Connector.Attributes('RemindingsWindow') = Main.RemindingsForm;
			}
		}
	} catch(e) {
	    Log.Write(lmtError, e.message);
	}
}

--

Осауленко Александр

Показать все комментарии