我有一个基于 mod_perl2 的 Web 应用程序,需要连接到 mysql 数据库。我已经以驼鹿角色实现了 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;
然后我在所有需要连接到数据库的驼鹿类中使用这个角色
with qw(Project::Role::SQLConnection);
陈述。
虽然这在创建几个对象时效果很好,但当创建多个对象时我很快就会遇到麻烦。例如,在 httpd 日志中,我收到错误消息:
DBI connect('alcatelRSA;host=10.125.1.21;port=3306','tools',...) 失败:C:/Perl/site/lib/DBIx/Connector.pm 第 30 行的连接太多
我考虑过每次都使用 DBIx::Connectors "disconnect" 调用来关闭与数据库的连接,但是根据需要打开/关闭连接对性能的影响似乎很严重。
你对这个问题有什么替代建议吗?