1

mod_perl のストレス テスト中に、データベース接続が失われるという問題に遭遇しました。プロセスがデータベース接続を共有しているため、問題が発生していると思われます。

しかし、私は Apache::DBI のすべての指示に従いましたが、これがわかりません。

startup.plではなく、子プロセスで接続を行っています。しかし、DBI->connect から各子によって返された $dbh を調べると、アドレスはすべての httpd プロセスで同じです。まず、これが適切に機能し、プロセスごとに再接続する場合、DBI->connect によって返されるアドレスは子プロセスごとに異なるはずですか? 私はそう仮定していますが、DBI (dbih_setup_handle) のコア C コードがこれを管理しており、同じアドレスを返していることがわかります。ですから、子供の中で再接続することの意味を理解していないのかもしれません.

$dbh ハンドルが同じ場合、適切に再接続していますか?

4

1 に答える 1

0

起動設定のセクション、または起動時にロードされたモジュールでデータベース接続を確立し、<perl>...</perl>フォークされたプロセスがそれを使用しようとするまでそれを維持しているようです。

残念ながら、これを回避することはできません。新しいプロセスが新しい接続を取得できるようにする必要があります。

$$この問題に対する私の解決策は、接続が確立されたときに何があったか (現在のプロセス ID) を追跡する dbh を取得する中央関数でした。接続を引き渡すときに、関数$$が変更されていることがわかった場合、既存の接続を閉じずに破棄し、新しい接続を作成します。

my $_dbh;
my $pid;

sub dbh {
        if($pid != $$) {
                $_dbh = DBI->connect(...);
                $pid = $$;
        }
        return $_dbh;
}

データベースを使用したいコードは、最初に呼び出しdbh()てデータベース ハンドルを取得し、必要に応じて新しいハンドルを作成するか、使用できる場合は以前に確立された接続を引き渡します。

于 2012-05-20T00:14:22.197 に答える