mysql データベースへの接続を必要とする mod_perl2 ベースの Web アプリがあります。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;
次に、DB への接続を必要とするすべての moose クラスでこのロールを使用します。
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" 呼び出しを使用して毎回データベースへの接続を閉じることを考えましたが、必要に応じて接続を開いたり閉じたりすると、パフォーマンスへの影響が深刻なようです。
この問題に関する別の提案はありますか?