Как предотвратить исчезновение MySql при использовании TIdHTTPServer

Я написал веб-сервер с использованием Delphi и компонента Indy TIdHttpServer. Я управляю пулом соединений TAdoConnection с базой данных MySql. Когда поступает запрос, я запрашиваю у своего пула доступные соединения с базой данных. Если он недоступен, создается новый TAdoConnection, который добавляется в пул.

Проблемы возникают, когда соединение становится «устаревшим» (т.е. оно не использовалось довольно долгое время). Я думаю, что в этом случае запрос приводит к ошибке «MySql ушел».

Есть ли у кого-нибудь способ обойти это? Или я сам справился бы с этим одним из следующих способов:

  1. Написание потока, который будет периодически «обновлять» все соединения.
  2. Отслеживание последнего активного запроса и, если он слишком старый, откажитесь от подключения и освободите его.

person M Schenkel    schedule 06.10.2014    source источник
comment
Поместите метку времени в свой объект пула при подключении к базе данных, выбросьте объект пула, когда он станет старым (т.е. x минут) и создайте новое соединение ...   -  person whosrdaddy    schedule 06.10.2014


Ответы (1)


Два предложения:

  • сохранять временную метку "последний раз" с каждым соединением в пуле, и если соединение запрошено, проверьте, не слишком ли старое соединение - в этом случае создайте новое

  • добавить validateObject() метод, который выдает простой SQL-запрос, чтобы определить, работает ли соединение

  • фоновый поток, который регулярно очищает пул: удаление незанятых соединений позволяет уменьшить размер пула до минимума после пикового использования

Некоторые предложения можно найти в этой статье о Apache Commons Pool Framework: http://www.javaworld.com/article/2071834/build-ci-sdlc/pool-resources-using-apache-s-commons-pool-framework.html

person mjn    schedule 06.10.2014
comment
Вычислил столько же .... Я полагаю, что порог, с которым мне нужно сравнивать, - это тайм-аут ожидания ?? - person M Schenkel; 06.10.2014
comment
@MSchenkel см. Мое обновление ... время ожидания может быть временем, когда клиент mysql перестает ждать ответа сервера. В связанной статье упоминается параметр конфигурации minEvictableIdleTimeMillis. Я бы сохранил этот параметр независимо от тайм-аута ожидания mysql, чтобы разрешить меньшие или большие значения. - person mjn; 06.10.2014