如何确定Perl DBI数据库处理程序的连接状态

时间:2010-08-04 18:33:25

标签: mysql perl dbi

如何确定Perl DBI数据库处理程序的连接状态(是连接opend)?像.NET SqlConnection.State == Open这样的东西。可能像

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

但找不到要使用的sql nop语句。

4 个答案:

答案 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()

但是,每次通话时正确的错误检查都更加确定。