У меня есть пул соединений MySQL для веб-службы данных. Когда он начинает обслуживать запрос, для его использования требуется соединение из пула. Проблема заключается в том, что если была значительная пауза, так как это конкретное соединение было использовано, сервер, возможно, приурочил его и закрыл его конец. Я хотел бы иметь возможность обнаружить это в коде управления пулами.
Хитрость такова: среда, в которой я кодирую, дает мне только очень абстрактный API в соединение. Я могу в основном выполнять только SQL-запросы. У меня нет доступа к фактическому сокету или прямому доступу к API-интерфейсу клиента MySQL.
Итак, вопрос: Что такое самый дешевый оператор MySQL, который я могу выполнить в соединении, чтобы определить, работает ли он. Например, SELECT 1;
должен работать, но мне интересно, есть ли что-то еще дешевле? Возможно, что-то, что даже не проходит через провод, но обрабатывается в клиентской библиотеке MySQL и эффективно отвечает на один и тот же вопрос?
Уточнение: Меня не интересует проверка работы сервера MySQL или настройка базы данных для ответа на запросы. Если эти вещи не работают, то последующий SQL, который выполняет служба, получит и обработает соответствующую ошибку. Я действительно обеспокоен только тем, что TCP-соединение открыто... поскольку, если сервер закрыл его, тогда SQL-служба SQL получит ошибку, которая означает "просто повторно подключиться и повторить попытку", и это было бы неудобно делать, гадость служебного кода.
Закрытие: Хвост /* ping */
- это именно то, что я искал, но, увы, доступно только через JDBC. Прочитав документы для этого взлома, ясно, что он был помещен туда по той же причине, что и я. Для любопытных я работаю в Haskel, используя HDBC и HDBC-mysql. Я попрошу автора HDBC-mysql добавить способ вызова mysql_ping()
либо напрямую, либо с помощью аналогичного взлома.
Влад DO 1
тоже был тем, чем я был, и, поскольку другой хак недоступен вне JDBC, я его буду использовать.
Спасибо за отличное обсуждение, особенно @Vlad!