6

データベースの特定の行の列がヒットするたびにインクリメントするPerlコードがあり、かなり頻繁にヒットすることを期待しているので、FCGIで最適化したいとします。今のところ、私は基本的にほとんどのコードを次のようなものでラップしています。

while (FCGI::accept() >= 0) {
 [code which currently creates a db connection and makes calls through it]
}

スクリプトが接続を維持するために、データベース接続(my $ dbh = DBI-> connect(etc))をFCGIループの外に置く方がよいのか、それともFCGIの利点を高速で得るのか疑問に思っています。 &リソースをループのままにしますか?

4

4 に答える 4

3

bmdhacks の言うとおり、MySQL または PostgreSQL を使用している場合、接続はかなり安価なので、それほど問題ではありません。ただし、データベースに関係なく、永続的な接続を使用することで速度が向上します.

ただし、永続的な接続を使用することにした場合は、接続のタイムアウトについて心配する必要があります。これらは、サーバーの設定と取得するトラフィックの量に応じて、プログラムの有効期間中にいつでも発生します。ping()あなたの友達はここにいます。さらにヘルプが必要な場合は、その方法を見てくださいApache::DBI

于 2008-10-16T01:43:45.777 に答える
2

接続をループの外に置かないでください。接続が失われ、再接続できなくなる可能性があります。グローバルに配置することもできますが、接続チェックを実行して自分で再接続する必要があります。

代わりに、Ima::DBIまたはDBI->connect_cached()接続キャッシュを使用してください。接続が有効であることを確認し、必要に応じて再接続するためにすべての作業を行います。

しかし、気にする前に、ベンチマークを行って、ボトルネックが実際にどこにあるかを見つけてください。過去にデータベース接続がボトルネックになったことがありますが、それはOracleであり、10年以上前のことでもありました。

于 2008-10-18T08:45:51.367 に答える
1

DB接続をループに保持している場合でも、FCGIから利益を得ることができますが、それを移動すると、さらに多くの利益が得られます。

于 2008-10-15T23:29:26.670 に答える
1

接続のパフォーマンスは、使用しているデータベースに大きく依存します。PostgreSQL と MySQL は接続が非常に高速であるため (特に MySQL)、通常は要求ごとに接続します。Oracle などの他のデータベースは少し遅く、より長い接続寿命が必要になる傾向があります。DBI->connect() を使用して while 1..100000 ループを記述し、切断してデータベースの速度を確認することにより、簡単にテストできます。

于 2008-10-15T23:55:24.370 に答える