Проблема с восстановлением соединения с сервером после простоя

Обсуждение возникших проблем, предложений и ошибок MyDAC компонентов
Ответить
asicorp2001
Сообщения: 1
Зарегистрирован: Вт 18 дек 2018 13:18

Проблема с восстановлением соединения с сервером после простоя

Сообщение asicorp2001 » Вт 18 дек 2018 13:32

Добрый день, я успешно соединяюсь с базой mysql. Делаю возможные операции (запросы, изменение данных)
Но после простоя например 5 минут, при попытке выполнить запрос возникает ошибка. Прикрепил в файле.
Пробовал по рекомендациям на форуме Localfavorites - true,
procedure Tdm.DBConnectConnectionLost(Sender: TObject;
Component: TComponent; ConnLostCause: TConnLostCause;
var RetryMode: TRetryMode);
begin
if RetryCount < 2 then begin
Inc(RetryCount);
RetryMode := rmReconnectExecute;
end
else begin
RetryCount := 0;
RetryMode := rmRaise;
end;
end;

Под вызова операции кнопкой стоит код
if not Dbconnect.Connected then Dbconnect.Connect;
tqticket.close;
tqticket.open;

При выполнении этого кода, ошибка, как во вложении.
Пробовал Dbconnect.Open; не помогает.
У меня тестовая версия компонента, хотел проверить. Может в этом проблема ? Доступа к настройкам сервера Mysql , не имею. Хостер говорит, что у них все хорошо и проблема в моем коде. Помогите.
Вложения
Errr_connect.jpg
Errr_connect.jpg (15.26 КБ) 8849 просмотров

ViktorV
Devart Team
Сообщения: 199
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Проблема с восстановлением соединения с сервером после простоя

Сообщение ViktorV » Ср 19 дек 2018 12:59

Обратите внимание, MyDAC автоматически не инициирует проверку соединения с сервером. Поэтому, после успешного соединения с сервером, если связь с сервером разрыватся свойство TMyConnection.Connected будет установленно в True и не возбуждаться событие OnConnectionLost пока не произойдет попытка обращения к серверу.
Для решения вашей задачи, вы можете использовать метод TMyConnection.Ping. Этот метод используется для проверки соединения с сервером MySQL, если соединение было разорвано, то возникнет ошибка и будет выполнена попытка переподключиться к серверу.
Также данный метод можно использовать для того, чтобы сервер не закрыл соединение по таймауту. В данном случае Вы можете использовать TMyConnection.Ping следующим образом - вызывать его из таймера, а интервал таймера установить в значение меньшее чем wait_timeout сервера (чтобы интервалы между получениями сервером команд не превышали wait_timeout).

OnConnectionLost событие происходит только при выполнении следующих условий:
- происходит фатальная ошибка;
- в соединении нет открытых транзакций, которые не являются ReadOnlyReadCommitted (если соединение имеет хотя бы одну открытую транзакцию, которая не является ReadCommitedReadOnly, FailOver не выполняется. Все ReadCommitedReadOnly транзакции восстанавливаются при помощи FailOver операции);
- если нет открытых или недочитанных датасетов;
- нет явно препарированных датасетов или SQL запросов.
Пожалуйста, убедитесь, что ни одно из вышеуказанных условий не нарушено.

Ответить