【问题标题】:How to add destructor to the db handle returned from DBI::connect?如何将析构函数添加到从 DBI::connect 返回的数据库句柄中?
【发布时间】:2013-09-02 10:58:19
【问题描述】:

这个包有一个 DBI->connect 的包装器:

Package MyPackage;
our $dbh;
sub connect {
    $dbh = DBI->connect(...)
    return $dbh;
}

sub disconnect {
    $dbh->disconnect;
    #some other things...
}
In the client program:
{
    my $dbh = MyPackage->connect(...)
}

MyPackage 只是一个函数包,它不是一个类。 但现在我想使用 RAII,当离开客户端调用 MyPackage->connect 的范围时,调用断开连接。 无法调用 DESTROY 函数,因为我们不返回 MyPackage 的对象。 我不想更改接口和客户端代码,例如添加新方法,所以我认为也许有一种方法可以从 DB 句柄继承并覆盖它的 DESTROY 方法。在 DESTROY 方法中,它可以调用 MyPackage- >断开连接。

这是可行的还是有人可以帮助想出其他好的解决方案? 非常感谢。

【问题讨论】:

    标签: perl dbi


    【解决方案1】:

    是的,如果你愿意,你可以这样做。

    Package MyPackage;
    use base 'DBI::db';
    sub connect {
        my $dbh = DBI->connect(...)
        bless $dbh => 'MyPackage';
        return $dbh;
    }
    
    sub DESTROY {
        my ($dbh) = @_;
        $dbh->disconnect;
        #some other things...
    }
    

    客户端程序仍然可以像以前一样调用您的connect 子例程。当实例超出范围时,将调用 DESTROY 方法并由您的代码处理。其他数据库句柄方法由 DBI::db 处理,就像以前一样。

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 2020-10-24
      • 2023-01-03
      • 2011-11-17
      • 1970-01-01
      • 2018-06-17
      • 2018-08-27
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多