Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与mod_perl2 moose应用程序的数据库连接过多_Perl_Moose_Mod Perl2 - Fatal编程技术网

与mod_perl2 moose应用程序的数据库连接过多

与mod_perl2 moose应用程序的数据库连接过多,perl,moose,mod-perl2,Perl,Moose,Mod Perl2,我有一个基于mod_perl2的web应用程序,需要连接到mysql数据库。我已经在moose角色中实现了SQL连接细节 简化后,角色如下所示: package Project::Role::SQLConnection; use Moose::Role; use DBIx::Connector; has 'connection' => (is => 'rw', lazy_build => 1); has 'dbh' => (is => 'rw', lazy_bu

我有一个基于mod_perl2的web应用程序,需要连接到mysql数据库。我已经在moose角色中实现了SQL连接细节

简化后,角色如下所示:

package Project::Role::SQLConnection;

use Moose::Role;
use DBIx::Connector;

has 'connection' => (is => 'rw', lazy_build => 1);
has 'dbh' => (is => 'rw', lazy_build => 1);
has 'db'    => ( is => 'rw', default => 'alcatelRSA');
has 'port'  => ( is => 'rw', default => 3306);
has 'host'  => ( is => 'rw', default => '10.125.1.21');
has 'user'  => ( is => 'rw', default => 'tools');
has 'pwd'   => ( is => 'rw', default => 'alcatel');


#make sure connection is still alive...
before dbh => sub {
    my $self = shift;
    $self->connection->run(fixup => sub { $_->do('show tables') });
};

sub _build_dbh {
    my $self = shift;
    return $self->connection->dbh;
}

sub _build_connection {
    my $self = shift;
    my $dsn = 'DBI:mysql:'.$self->db.';host='.$self->host.';port='.$self->port;
    my $conn = DBIx::Connector->new($dsn, $self->user, $self->pwd);
    return $conn;
}

no Moose::Role;
1;
然后,我在所有需要连接到数据库的moose类中使用这个角色

 with qw(Project::Role::SQLConnection);
声明

虽然这在创建几个对象时效果很好,但在创建多个对象时,我很快就会遇到麻烦。例如,在httpd日志中,我得到一个错误:

DBI connect('alcatelRSA;主机=10.125.1.21;端口=3306','tools',…)失败:C:/Perl/site/lib/DBIx/Connector.pm第30行的连接太多

我曾考虑过每次使用DBIx::Connectors“disconnect”调用来关闭与数据库的连接,但根据需要打开/关闭连接对性能的影响似乎很严重


关于这个问题,你有其他的建议吗?

你是在复制胸径,并在超出对象范围的地方使用它吗?文件中明确指出不要这样做。相反,保存DBIx::Connector对象本身,并使用属性中的
handles
选项将
dbh
方法调用委托给它

这就是我所做的(事实上,我昨天刚刚发布了这段代码来回答另一个问题;有趣的是,DB问题是如何打包的):


您可能还想看看您允许多少mod_perl进程。每个单独的进程或线程都必须有自己的DB连接,但可能不止一个,因此您可能还需要确保上面的代码在每个进程中只运行一次(即构建DB管理对象),并且每次后续构建此类对象的尝试只会返回现有对象的副本。一个简单的方法是使用,但这会引入自身的其他设计问题。

谢谢,我非常喜欢这段代码,但它仍然无法解决“连接太多…”的问题。我怀疑,对于当前的问题,设计需要的不是将DB连接封装在一个角色中,仅仅是因为创建了太多的对象。
has dbixc => (
    is => 'ro', isa => 'DBIx::Connector',
    lazy_build => 1,
    # DO NOT save a copy of the dbh. Use this accessor every time, as
    # sometimes it will change unexpectedly!
    handles => [ qw(dbh) ],
);

sub _build_dbixc
{
    my $this = shift;
    DBIx::Connector->new(
        $this->dsn,
        $this->username,
        $this->password,
        $this->connect_options,
    );
}

sub call_dbh
{
    my $this = shift;
    my $method = shift;
    my @args = @_;

    # the normal behaviour -- pings on every dbh access
    #return $this->dbh->$method(@args);

    # the smart behaviour -- presume the DB connection still works
    $this->dbixc->run(fixup => sub { $_->$method(@args) });
}