如何确定Perl DBI数据库处理程序的连接状态(是连接opend)?像.NET SqlConnection.State == Open这样的东西。可能像
defined($dbh->do("some nop sql"))
但找不到要使用的sql nop语句。
答案 0 :(得分:12)
如果通过调用
连接数据库句柄,您可以询问它$dbh->ping();
某些数据库驱动程序不实现ping
但DBD :: mysql实现。另一种方法是为MySQL运行像select 1
这样的空选择。我正在假设MySQL,因为这是你的问题被标记的方式。其他数据库的答案会略有不同。
答案 1 :(得分:5)
这个答案有两个部分。
第一个答案是{Active}
字段。 perldoc DBI
说:
所有手柄的共同点
这些属性对所有人都是通用的 DBI句柄的类型。 [...]
“Active”(布尔值,只读)
如果是,则“Active”属性为true handle对象是“active”。这是 很少用于应用程序。最正确 活跃的含义有些模糊 此时此刻。对于数据库处理它 通常意味着手柄是 连接到数据库 (“$ dbh-> disconnect”设置“Active” 关)。
这可能就是你要检查的内容。
第二个答案是,虽然您可以致电ping()
,或查看SELECT 1
的结果,但没有多大意义。这确实会告诉您在检查时是否连接了数据库句柄。但是你真正想知道的是,当你做下一个即将做的事情时,数据库句柄是否已连接,对吧?并且总是有可能在您的支票和您实际想要做的事情之间连接失败。因此,其中任何一个的真实结果都不是任何保证。
如果您正在进行状态监控,那么ping()
或SELECT 1
就可以了。但是,在应用程序中,在执行某些操作之前不要检查dbh的有效性。只需连接,然后使用你回来的dbh,并在每一步都进行适当的错误检查。正确检查错误是无可替代的。
答案 2 :(得分:1)
ping方法 - 虽然它的作用是依赖于数据库驱动程序。
答案 3 :(得分:1)
还有$dbh->state()
但是,每次通话时正确的错误检查都更加确定。