2

Webアプリケーションにmod_perlを使用しています。現在、ネットワーク全体でmysqlデータベースを使用する予定です。display_customer_transaction.cgiへのすべてのCGIリクエストで、私のスクリプトは

  1. ネットワーク全体でデータベース接続を開きます
  2. SQLステートメントを使用してデータベースでクエリを実行します
  3. データベースから取得したデータを分析する
  4. データをHTML形式で印刷します
  5. データベース接続を閉じます

プロファイリングを行った後、ステップ(1)がボトルネックであることがわかりました。したがって、CGIリクエストごとにデータベース接続を開いたり閉じたりすることは避けたいと思います。私の願いは、最初のCGI要求がデータベース接続を開いた場合、(別のクライアントからの)2番目の着信CGI要求が最初のデータベース接続を再利用する可能性があることです。

「DBIX永続データベース接続」をGoogleで試しましたが、関連する結果がほとんど見つかりませんでした。(編集:これは、DBIC、またはDBIXではなくDBIx :: Classと呼ばれるためです。)

さらに、 Apache :: DBIを使用して関連情報を見つけます(ただし、私の意図はApache :: DBIではなくDBIXにあります)。私を混乱させたいくつかの情報があります:

Apache :: DBIモジュールにはまだ制限があります。それは、プロセスごとにデータベース接続を永続的に保ちます。

その間ずっと、ApacheがCGIリクエストをどのように処理するかについての私の概念は

  1. Apacheは常に新しいプロセスを生成して、着信する新しいCGIリクエストを処理します。PerlインタープリターがPerlスクリプトの実行を終了するたびに、プロセスは停止します。

したがって、Apache :: DBIモジュールがデータベース接続をプロセスごとに永続的に維持することしかできない場合、2番目のCGI要求は、最初のCGI要求によって開かれた接続をどのように再利用できますか?

しかし、私の元の質問に戻ってください。mod_perlでDBIX永続データベース接続を使用するにはどうすればよいですか?

4

3 に答える 3

4

書き留める前に、Apache::DBIを試してください。ただし、CGIスクリプトを永続的にすることも必要です。現在バニラCGIプログラムがある場合は、PerlRunまたはPerlRegistryオプションを使用してそれらを永続化できます。それは、Apache :: DBIとともに、その仕事をするはずです。もちろん、各子プロセスにはDBI接続がありますが、それは不合理ではありません。

あなたがそれをあきらめる前にそれを試してみてください。:)

于 2009-04-09T15:36:39.640 に答える
1

Apache :: DBIは、DBIモジュールの動作方法を変更します。DBIx :: Classを使用していると仮定すると(十分に具体的ではありません)、DBIモジュールを使用してDB接続を取得するため、これで問題ありません。

mod_perlを使用すると(そしてmod_perlの設定が正しいと仮定すると)、PerlインタープリターがApacheにロードされ、プログラムがそこにロードされます。Apacheは、リクエストを処理するために限られた数のプロセスを実行します。各プロセスは複数のリクエストを処理します。

Apacheプロセスは最終的には停止し、再生成されますが、それが発生する前に多くの要求を処理します。これらは、Apache::DBIドキュメントが参照するプロセスです。「同じ接続を何度も再利用しますが、一度に1つの接続しか開いていないという意味ではありません」と言おうとしています。

于 2009-05-06T20:40:49.463 に答える
0

最後に、1秒あたりの接続数が非常に少ないと判断したため、現時点では持続的接続を使用していません。パフォーマンススケーリングプランについては、DBIx+memcacheソリューションを使用したいと思います。

于 2009-05-26T03:42:49.733 に答える