与Catalyst的持久数据库连接

时间:2015-04-03 23:50:58

标签: perl dbi catalyst

我的组织有一个自定义程序包,用于连接我们的数据库服务器,负责随机尝试各种镜像(根据配置文件),只尝试使用master数据库服务器进行非只读连接,或者没有镜像可以到达。我想接受它并使用它在Catalyst应用程序中拥有持久连接。

我尝试过的是基于Catalyst :: Model :: DBI创建一个Model包,但重新定义了该模块的connect()方法以使用我们的包的连接方法。然后我重新定义了" selectall_arrayref"," do"使用stay_connected()的方法...它工作正常,但它为每个查询创建一个新连接 - 即使在相同的http请求期间 - 尽管Catalyst :: Model :: DBI的文档似乎暗示了连接应该坚持不懈。

所以我的问题是,应该发生什么?我是否需要做一些不同的事情以获得持久的处理? Model :: DBI通常会提供吗?如果是这样,我如何将我们的东西移植到其中,还是有更好的方法?我不想重新编写整个软件包以使用DBIx :: Class,我只想插入我们的例程,它为我的系统提供了一个正确的数据库句柄。

package SpamControl::Model::Database;
use strict;
use Freecycle::Database;

use base 'Catalyst::Model::DBI';

# redefine the connect method, this is just copied from Model::DBI but  using the Freecycle package for the actual connection.
sub connect {
    my $self = shift;
    my $dbh;
    # TODO: I wish this could be a persistent connection.
    eval {
            $dbh = Freecycle::Database::connect({ username => 'member', read_only => 1 });
    };
    if ($@) { $self->{log}->debug( qq{Couldn't connect to the database "$@"} ) if $self->{debug} }
    else { $self->{log}->debug ( 'Connected to the database')  if $self->{debug}; }
    $self->_pid( $$ );
    $self->_tid( threads->tid ) if $INC{'threads.pm'};
    return $dbh;
}

# for read/write connections
sub dbh_admin {
    my ($self,$c) = @_;
    my $dbh = Freecycle::Database::connect({ username => 'admin', read_only => 0 });
    return $dbh;
}

sub do {
    my $self = shift;
    return $self->dbh_admin->do(@_);
}

sub selectall_hashref {
    my $self = shift;
    return $self->stay_connected->selectall_hashref(@_);
}

...etc etc.

1 个答案:

答案 0 :(得分:2)

Catalyst::Model::DBI提供持久连接和自动重新连接(现在通过DBIx::Connector)。

如果你有一个已经这样做的模块(Freecycle::Database?)你根本不应该使用Catalyst::Model::DBI,而是使用你的模块作为Catalyst模型,Catalyst::Model::Adaptor可以帮助很多。