Добрый день.
субд MSSQL 2016
Суть проблемы заключается в том что программа зависает, если в компоненте TFDConnection стоит автоматическое восстановление связи при потере соединения (делая разные тесты "ноги растут" похоже от туда). Жалуются пользователи начиная с момента когда сделал переход с XE6 на DX10.2... сейчас уже стоит DX10.3.1 и проблема с зависаниями похоже не решается в лучшую сторону. 2 проблемы, посоветуйте что можно посмотреть... не могу отрицать, что в свойствах TFDConnection мог что-то упустить..
Код настройки автоматического переподключения:
try
// Соединение с БД.
FConnection := TFDConnection.Create(nil);
// Свобода действий. Не накладывает никаких ограничений на взаимодействие
// транзакций. Обеспечивает лучшую производительность и максимальный
// параллелизм. Возможен случай чтения "грязных" данных.
FConnection.TxOptions.Isolation := xiDirtyRead;
// Загрузка полного набор данных.
FConnection.FetchOptions.Mode := fmAll;
// Строка коннекции.
FConnection.ConnectionString := FBranchConnection;
FConnection.LoginPrompt := False;
// Флаг автоматического восстановления соединения.
FConnection.ResourceOptions.AutoReconnect := True;
// Флаг тихого выполнения хранимых процедур и запросов.
FConnection.ResourceOptions.SilentMode := True;
FConnection.Open;
FConnection.Connected := True;
except
on E: Exception do
begin
if Assigned(FConnection) then
FreeAndNil(FConnection);
MessageBox(Handle, PChar(E.Message), nil, MB_OK Or MB_ICONERROR);
Exit;
end;
end;
Проблема 1-я: Полная потеря соединения.
Провоцирую очень просто... выключаю mssql и на машине в локальной сети "кидаю" запрос.. далее очень длительное ожидание (2-ве, может больше, минут) до момента появления ошибки соединения (возможно так и должно быть.. тут маленький вопрос а можно уменьшить время ожидания?), не восстанавливая соединения с MSSQL закрываю программу, она как бы закрылась, но через диспетчер задач поток продолжает висеть в памяти. В логе виндовс что-то непонятное:
Имя сбойного приложения: test.exe, версия: 0.0.0.0, метка времени: 0x5d43e410
Имя сбойного модуля: KERNELBASE.dll, версия: 10.0.17763.615, метка времени: 0x832170f2
Код исключения: 0x0eedfade
Смещение ошибки: 0x0011fd62
Идентификатор сбойного процесса: 0x36c8
Время запуска сбойного приложения: 0x01d5490a62890496
Путь сбойного приложения: C:\ProgramData\testcomp\test1\test.exe
Путь сбойного модуля: C:\WINDOWS\System32\KERNELBASE.dll
Идентификатор отчета: 56d901d3-492c-40b6-a765-5df1246e030c
Полное имя сбойного пакета:
Код приложения, связанного со сбойным пакетом:
Поток программы не зависает если разъединения с БД не было, пробовал всякими средствами всегда корректное закрытие.
Теперь 2-я проблема (думаю с первой есть взаимосвязь.)
Провоцирую след. образом... выключаю mssql и на машине в локальной сети "кидаю" запрос, далее сразу включаю MSSQL... идёт корректное переподключение программа не сбоит и работает как надо... но в мониторе ресурсов mssql вижу лишний поток подключения с программой. До момента момента обрыва связи 2 пары, 1-я пара используется TFDConnection, 2-я пара используется TFDEventAlerter (использую для уведомлений со стороны MSSQL) а 3-я пара появляется "магическим" образом в момент переподключения. Далее выключаю программа... она как бы закрылась, но её поток весит в памяти... в жунале виндовс та же ошибка.
Я делал тест немного по другому... выключил MSSQL и включил его, со стороны машины в сети запрос не кидал... в этом случае изначально идёт автоматическое соединение компонента TFDEventAlerter (вижу 1-ю пару в мониторе ресурсов mssql, переподключается автоматически), а вот подключение компонента TFDConnection происходит в момент если кинуть запрос на MSSQL через программу (вижу вторую пару подключения)... в этом случае третьей пары подключения нет и закрывая программу она выгружается без проблем, поток в памяти не весит.
Попытался расписать очень подробно... может у кого есть идеи что можно посмотреть?