11

現在、生のDBIを使用してMySQLに接続し、SQLステートメントを実行する大規模なperlアプリケーションがあります。毎回接続を作成して終了します。mysqlの接続制限に近づき始めていました(一度に200)

DBIx::Connectionはアプリケーション層の接続プールをサポートしているようです。

誰かが何か経験がありDBIx::Connectionますか?接続プールに関する他の考慮事項はありますか?

またmod_dbd、接続プールを処理しているように見えるApachemodもわかります。 http://httpd.apache.org/docs/2.1/mod/mod_dbd.html

4

2 に答える 2

9

DBIx :: Connectionの経験はありませんが、DBIx :: Connector(基本的に、DBIx :: Classが内部で使用するものですが、インライン化されています)を使用しています。これはすばらしいことです...

これらの接続をMooseオブジェクトラッパーでプールします。Mooseオブジェクトラッパーは、接続パラメーターが同一である場合に既存のオブジェクトインスタンスを返します(これは、基になるDBオブジェクトでも同じように機能します)。

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;
}
于 2010-07-16T20:50:51.470 に答える
5

念のために言っておきますが、あなたは知っていますよDBI->connect_cached()ね?connect()これは、perlスクリプトの存続期間中、可能な場合はdbhを再利用するためのドロップイン代替品です。たぶんあなたの問題は7文字を追加することで解決できます:)

そして、MySQLの接続は比較的安価です。DBをmax_connections=1000それ以上で実行しても、それ自体で問題が発生することはありません。(クライアントがDBで処理できるよりも多くの作業を要求している場合、それはより深刻な問題であり、低い方max_connectionsが延期する可能性がありますが、もちろん解決されません。)

于 2010-08-14T17:15:43.587 に答える