Perl DBI 连接池

问题描述 投票:0回答:2

现在我们有一个大型 Perl 应用程序,它使用原始 DBI 连接到 MySQL 并执行 SQL 语句。它每次都会创建一个连接并终止。开始接近 mysql 的连接限制(一次 200 个)

看起来DBIx::Connection支持应用层连接池。

有人有过

DBIx::Connection
的经验吗?连接池还有其他考虑因素吗?

我还看到

mod_dbd
这是一个 Apache mod,看起来它可以处理连接池。 http://httpd.apache.org/docs/2.1/mod/mod_dbd.html

mysql perl apache mod-perl
2个回答
9
投票

我对 DBIx::Connection 没有任何经验,但我使用 DBIx::Connector (本质上是 DBIx::Class 在内部使用的,但内联的),它很棒......

我将这些连接与 Moose 对象包装器进行池化,如果连接参数相同,该包装器会交回现有对象实例(这对于任何底层数据库对象都是相同的):

package MyApp::Factory::DatabaseConnection;
use strict;
use warnings;

use Moose;

# table of database name -> connection objects
has connection_pool => (
    is => 'ro', isa => 'HashRef[DBIx::Connector]',
    traits  => ['Hash'],
    handles => {
        has_pooled_connection => 'exists',
        get_pooled_connection => 'get',
        save_pooled_connection => 'set',
    },
    default => sub { {} },
);

sub get_connection
{
    my ($self, %options) = @_;

    # some application-specific parsing of %options here...

    my $obj;
    if ($options{reuse})
    {
        # extract the last-allocated connection for this database and pass it
        # back, if there is one.
        $obj = $self->get_pooled_connection($options{database});
    }

    if (not $obj or not $obj->connected)
    {
        # look up connection info based on requested database name
        my ($dsn, $username, $password) = $self->get_connection_info($options{database});
        $obj = DBIx::Connector->new($dsn, $username, $password);

        return unless $obj;

        # Save this connection for later reuse, possibly replacing an earlier
        # saved connection (this latest one has the highest chance of being in
        # the same pid as a subsequent request).
        $self->save_pooled_connection($options{database}, $obj) unless $options{nosave};
    }

    return $obj;
}

6
投票

只是确保:您知道

DBI->connect_cached()
,对吗?它是
connect()
的直接替代品,可以在 Perl 脚本的生命周期中尽可能重用 dbh。也许你的问题可以通过添加 7 个字符来解决:)

而且,MySQL 的连接相对便宜。在

max_connections=1000
或更高级别运行数据库本身不会导致问题。 (如果您的客户要求的工作超出了数据库的处理能力,那么这是一个更严重的问题,较低的
max_connections
可能会推迟这个问题,但当然无法解决。)

© www.soinside.com 2019 - 2024. All rights reserved.