Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 667
Добрый день.

субд 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 через программу (вижу вторую пару подключения)... в этом случае третьей пары подключения нет и закрывая программу она выгружается без проблем, поток в памяти не весит.

Попытался расписать очень подробно... может у кого есть идеи что можно посмотреть?

К сообщению приложен файл. Размер - 102Kb
2 авг 19, 12:03    [21940537]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 667
Добрый день.


Пару дней "каверзных" тестов привели меня к тому, что не правильная работа автоматического соединения TFDConnection из за использования TFDEventAlerter.

Что с этим делать вообще непонятно... такое ощущение что TFDEventAlerter создаёт свой собственный TFDConnection, который живёт в каком-то своём потоке, которым управлять не получается((

Победить правильную работу автоматического восстановления связи в случае "DX 10.3.1 + FireDAC + MSSQL" с использованием TFDEventAlerter - не получилось, механизм приводит к зависанию программы по её завершению (только если были обрывы связи с БД) при этом появляется лишнее соединение, которое видно в "мониторе активности" менеджмент студии (в случае восстановления связи после обрыва).
6 авг 19, 15:08    [21943018]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30600

06.08.2019 15:08, Игорь_UUS пишет:
> Пару дней "каверзных" тестов привели меня к тому, что не правильная работа автоматического соединения TFDConnection из за использования TFDEventAlerter.

не пользуй эту хрень

Posted via ActualForum NNTP Server 1.5

6 авг 19, 15:22    [21943030]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1604
https://quality.embarcadero.com/browse/RSP-24411

Оно?

Пофиксили в 10.3.2
6 авг 19, 15:27    [21943035]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 667
X-Cite
https://quality.embarcadero.com/browse/RSP-24411

Оно?

Пофиксили в 10.3.2


бррр.. а 10.3.2 уже вышла... или ещё тестируется?
6 авг 19, 16:00    [21943065]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 667
Мимопроходящий
06.08.2019 15:08, Игорь_UUS пишет:
> Пару дней "каверзных" тестов привели меня к тому, что не правильная работа автоматического соединения TFDConnection из за использования TFDEventAlerter.

не пользуй эту хрень


Если не эта "хрень" то какая есть альтернатива?
6 авг 19, 16:01    [21943068]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30600

06.08.2019 16:01, Игорь_UUS пишет:
> Если не эта "хрень" то какая есть альтернатива?

IBX

Posted via ActualForum NNTP Server 1.5

6 авг 19, 16:09    [21943075]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 667
Мимопроходящий
06.08.2019 16:01, Игорь_UUS пишет:
> Если не эта "хрень" то какая есть альтернатива?

IBX


)) InterBase не вариант... использую mssql
6 авг 19, 16:12    [21943078]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1604
Игорь_UUS
X-Cite
https://quality.embarcadero.com/browse/RSP-24411

Оно?

Пофиксили в 10.3.2


бррр.. а 10.3.2 уже вышла... или ещё тестируется?

Уже как две недели вышла..
6 авг 19, 18:00    [21943175]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 667
Поставил апдейтом 10.3.2 бага осталась, лучше не стало... вижу изменения в размерах bpl... вроде как обновилось

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

Стоит пробовать полный снос и установку с нуля?
7 авг 19, 12:23    [21943674]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1604
Игорь_UUS
Поставил апдейтом 10.3.2 бага осталась, лучше не стало... вижу изменения в размерах bpl... вроде как обновилось

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

Стоит пробовать полный снос и установку с нуля?


Удаляете 10.3.1 затем ставите 10.3.2

Как по мне, из-за того что они меняют системные bpl, а версионирования нет, как в .Net то лучше все сносить, чистить реестр, папки, и ставить с нуля все.

Я сначала все сделал с сохранением реестра, но получил кривизну в GetIt
Delphi думала что пакеты стоят, хотя их нет. На это кстати и ругалась. В итоге в GetIt отображались оба компонента типа старый и новый... при чем старый типа установлен, а новый нет. И удалить старый нельзя и поставить новый нельзя.
Да и где гарантия что адресация методов в системных bpl не изменилась, из-за чего могут потом всплыть баги при сборке проектов со сторонними либами.

Поэтому я снес 10.3.2. со всеми приблудами (codesite express + interbase server)
Почистил реестр тут и тут (удалил ветки)
HKEY_CURRENT_USER\Software\Embarcadero\
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Embarcadero\

Почистил папки со всеми bpl в
c:\Users\Public\Documents\Embarcadero\Studio\20.0\Bpl\
c:\Users\Public\Documents\Embarcadero\Studio\20.0\DCP\
c:\Users\Public\Documents\Embarcadero\Studio\20.0\CatalogRepository\

Перезагрузил комп
Поставил свежую 10.3.2 и пересобрал все что требовалось для проектов.
7 авг 19, 12:36    [21943694]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 667
X-Cite,

ещё заметил... если зайти в скомпиленный в 10.3.1 стоит "FireDAC = 17.0.0 (Build 93731)" и то же самое в 10.3.2

Вы можете посмотреть у себя, какая у Вас сборка фаердака?? буду очень признателен... я посмотрел через стандартную форму подключения к базе данных, на вкладке Info
7 авг 19, 12:38    [21943700]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1604
FireDAC.Stan.Consts.pas
const
  C_FD_Version = '17.0.0 (Build 93731)';


Если сравнивать изменения в FireDAC.Phys.pas
то поменялось примерно следующее...
В TFDPhysEventThread.DoTimeout; TFDThread.Synchronize заменился на TFDThread.Queue
А в TFDPhysEventAlerter.Register; и TFDPhysEventAlerter.Unregister; убрали TFDPhysConnection.Lock/Unlock

Если у вас приложение без Link With Runtime, то вы можете этот файл подложить в проект и залогировать весь TFDEventAlerter и попытаться понять где же зависает... Подправить и использовать измененный или написать в QC, что не починилось...
7 авг 19, 13:39    [21943768]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 667
X-Cite
FireDAC.Stan.Consts.pas
const
  C_FD_Version = '17.0.0 (Build 93731)';


Если сравнивать изменения в FireDAC.Phys.pas
то поменялось примерно следующее...
В TFDPhysEventThread.DoTimeout; TFDThread.Synchronize заменился на TFDThread.Queue
А в TFDPhysEventAlerter.Register; и TFDPhysEventAlerter.Unregister; убрали TFDPhysConnection.Lock/Unlock

Если у вас приложение без Link With Runtime, то вы можете этот файл подложить в проект и залогировать весь TFDEventAlerter и попытаться понять где же зависает... Подправить и использовать измененный или написать в QC, что не починилось...



сейчас у меня вот такой код:

{-------------------------------------------------------------------------------}
procedure TFDPhysEventThread.DoTimeout;
begin
  if Active and (FAlerter.GetOptions.Timeout > -1) then
    if FAlerter.GetOptions.Synchronize then
      TFDThread.Queue(nil, FAlerter.DoTimeout)
    else
      FAlerter.DoTimeout;
end;


я так полагаю как раз последней версии? т.е. устанавливать с "0"-ля особого смысла нет?
7 авг 19, 14:22    [21943814]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1604
Игорь_UUS
т.е. устанавливать с "0"-ля особого смысла нет?

Это зависит от того, насколько вы перфекционист..
7 авг 19, 14:27    [21943818]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 667
X-Cite
Игорь_UUS
т.е. устанавливать с "0"-ля особого смысла нет?

Это зависит от того, насколько вы перфекционист..


вот "блин" незадача...
7 авг 19, 14:41    [21943838]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 667
X-Cite,

решил пойти по тяжёлому пути... удалим всё как вы сказали и поставим студию с "0"-ля... потом пересоберу все компоненты
7 авг 19, 14:55    [21943844]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 667
X-Cite,

Добрый день. Всё поставили с "0"-ля... на мой взгляд ничего не поменялось, бага присутствует и в 10.3.2.


Но Вы не поверите)) дело было в драйвере... на компе в сети стоял драйвер ms sql native client 10... поставил native client 11... всё стало работать как часики. И восстановление связи отрабатывает корректно и при закрытии программа не липнет в памяти (проверял несколько раз, все успешны).

Могу предположить, что FireDAC работает немного по разному сравнивая "native client 10" и "native client 11"
8 авг 19, 10:30    [21944409]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1604
Учитывая что у вас MSSQL 2016 не думаете поставить ODBC 13.0?
8 авг 19, 11:36    [21944504]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1604
Игорь_UUS
X-Cite,
Но Вы не поверите)) дело было в драйвере... на компе в сети стоял драйвер ms sql native client 10... поставил native client 11... всё стало работать как часики. И восстановление связи отрабатывает корректно и при закрытии программа не липнет в памяти (проверял несколько раз, все успешны).

Могу предположить, что FireDAC работает немного по разному сравнивая "native client 10" и "native client 11"


Можно кстати запостить в QC...
8 авг 19, 11:37    [21944505]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 667
X-Cite
Игорь_UUS
X-Cite,
Но Вы не поверите)) дело было в драйвере... на компе в сети стоял драйвер ms sql native client 10... поставил native client 11... всё стало работать как часики. И восстановление связи отрабатывает корректно и при закрытии программа не липнет в памяти (проверял несколько раз, все успешны).

Могу предположить, что FireDAC работает немного по разному сравнивая "native client 10" и "native client 11"


Можно кстати запостить в QC...


Я бы сказал нужно))) Но тут важна обязательная связка с TFDEventAlerter... без него всё работает корректно... и конечно же "native client 10"

Скажите, зачем ODBC 13.0? Вообще говоря вроде как есть и 16-й и 17-й ODBC... а главное при установке MSSQL 2016 ставиться именно native client 11 и я его считаю как основной драйвер...
8 авг 19, 13:17    [21944640]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC на DX 10.3.1 + MSSQL2016 - зависание программы.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1604
Игорь_UUS,

Да, я имел ввиду 17-ый....
Ну просто если использовать фишки которые появились только в 16 или 17, то SQLNCLI11 про них ничего не знает же...
Но он универсальный и со стандартными возможностями справляется, не спорю...
8 авг 19, 15:47    [21944912]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить