Имеется на Lazarus написанная служба windows.
Используется многопоточный idHTTPServer работает в нескольких местах.
Везде стабильно. Но в одном месте приходят тяжелые запросы сразу пачками по 6-8 штук каждые 10 сек.
Через 2-3 часа работы служба виснет.
пока сделали bat-ник который каждые 10 сек "пингует" ее curl-ом с запросом -X HEAD и если нет ответа определяет PID процесса, прибивает службу и перезапускает.
Но это костыль, и нужно разобраться.
Навтыкал во многих местах try except и сохраняю исключение через логгер класса TCustomDaemon
- Код: Выделить всё
RestService.LogMessage(FormatDateTime('YYYY-MM-DD_hh:nn:ss.zzz',NOW)+ ' Exception {тут вставляю имя функции} --- '+E.ToString );
Отловил странную ошибку.
EAccessViolation: Access violation
в процедуре создания объектов TMSSQLConnection, TSQLTransaction, TSQLQuery они создаются в каждом потоке и удаляются перед закрытием.
Обновил библиотеку dblib.dll с версии 1.0 на 1.3
А создание компонент оформил циклом из нескольких попыток, с паузой между попытками.
Повторно эта ошибка пока не появлялась.
Но хочется понять смысл, почему ограничивается доступ. Что вероятнее? проблема с многопоточностью библиотеки или MS SQL ограничивает частоту и кол-во подключений? (не встречал ни разу такую настройку).
Так же происходят зависания, которые не попадают в виндовый журнал. Сижу расставляю дальше try excep . А может есть какая то настройка у TDaemon? чтобы все критические события в работе автоматом записывались в журнал, и не было нужды расставлять везде try except?