我有一个基于mod_perl2的web应用程序需要连接到mysql数据库。我已经在一个驼鹿角色中实现了SQL连接细节。与mod_perl2 moose应用程序的数据库连接太多
简体,作用如下所示:
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',...) failed: Too many connections at C:/Perl/site/lib/DBIx/Connector.pm line 30
我想过使用DBIx ::连接“断开”调用来关闭每次与数据库的连接,但对性能的影响似乎严重开/根据需要关闭连接。
您对这个问题有其他建议吗?
谢谢,我真的很喜欢这个代码,但它仍然不能解决“太多连接..”的问题。我怀疑,对于手头的问题,设计只是要求将某个角色的数据库连接封装起来,这是因为创建的对象太多。 – 2010-06-18 10:16:37