Как определить состояние соединения с обработчиком базы данных Perl DBI - PullRequest
3 голосов
/ 04 августа 2010

Как определить состояние подключения обработчика базы данных Perl DBI (подключение открыто)?Что-то вроде .NET SqlConnection.State == Открыть.Может быть что-то вроде

defined($dbh->do("some nop sql"))

, но не может найти оператор sql nop для использования.

Ответы [ 4 ]

12 голосов
/ 04 августа 2010

Вы можете узнать свой дескриптор базы данных, подключен ли он, позвонив по номеру

$dbh->ping();

Некоторые драйверы БД не поддерживают ping, а DBD :: mysql -. Альтернативой является запуск пустого выбора, например select 1 для MySQL. Я предполагаю, MySQL, так как это, как ваш вопрос помечен. Другие базы данных будут иметь несколько иные ответы.

5 голосов
/ 14 августа 2010

Этот ответ состоит из двух частей.

Первый ответ - поле {Active}. perldoc DBI говорит:

АТРИБУТЫ ОБЩИЕ НА ВСЕ РУЧКИ

Эти атрибуты являются общими для всех типы ручек DBI. [...]

«Активен» (логический, только для чтения)

Атрибут "Active" имеет значение true, если дескриптор объекта "активен". Это редко используется в приложениях. Точный значение активного является несколько расплывчатым в момент Для базы данных справиться с этим как правило, означает, что ручка подключен к базе данных («$ dbh−> disconnect» устанавливает «Active» выкл).

Это, вероятно, то, что вы хотите проверить.

Второй ответ заключается в том, что, хотя вы можете позвонить ping() или проверить результат SELECT 1, особого смысла нет. Это действительно скажет вам, подключен ли дескриптор базы данных во время этой проверки. Но что вы действительно хотите знать, так это то, подключен ли дескриптор базы данных, когда вы делаете то, что собираетесь делать дальше, верно? И всегда есть вероятность, что связь между вашей проверкой и тем, чем вы действительно хотите заниматься, прервется. Таким образом, истинный результат любого из них не является гарантией чего-либо.

Если вы проводите мониторинг состояния, то ping() или SELECT 1 подойдет. В приложении, однако, не проверяйте действительность dbh перед тем, как что-то делать. Просто подключитесь и используйте dbh, который вы получите, и выполняйте правильную проверку ошибок на каждом этапе. Там нет замены для правильной проверки на ошибки.

1 голос
/ 13 апреля 2011

есть также $dbh->state()

но да, правильная проверка ошибок при каждом вызове более надежна.

1 голос
/ 04 августа 2010

Метод ping - хотя то, что он делает, зависит от драйвера базы данных.

...