54

私はプロジェクトのデータアクセスにPHPのPDOレイヤーを使用していますが、それを読んで、永続的なDB接続を適切にサポートしていることを確認しています。いつ/いつ使うべきか迷っています。CRUDを多用するアプリでパフォーマンス上のメリットはありますか?おそらくセキュリティに関連して、考慮すべき欠点はありますか?

重要な場合は、MySQL5.xを使用しています。

4

7 に答える 7

72

これを大まかな「ルールセット」として使用できます。

YES : 次の場合、永続的な接続を使用します。

  • データベースにアクセスするアプリケーション/ユーザーはごくわずかです。つまり、同じホストで 200 の異なるユーザーが共有されているため、200 のオープン (ただしおそらくアイドル) 接続になることはありません。
  • データベースは、ネットワーク経由でアクセスしている別のサーバーで実行されています
  • (1 つの) アプリケーションがデータベースに頻繁にアクセスする

いいえ、次の場合は永続的な接続を使用しないでください。

  • アプリケーションは、データベースに 1 時間に 100 回アクセスするだけで済みます。
  • 1 つのデータベース サーバーにアクセスする Web サーバーが多数ある場合
  • プリフォーク モードで Apache を使用しています。子プロセスごとに 1 つの接続を使用するため、かなり迅速に増加する可能性があります。(コメントの@Powerlord経由)

特にネットワーク経由でデータベースにアクセスしている場合は、永続的な接続を使用するとかなり高速になります。データベースが同じマシンで実行されている場合、それほど大きな違いはありませんが、それでも少し高速です。ただし、名前が示すように、接続は永続的です。つまり、使用されていない場合でも開いたままになります。

それに関する問題は、「デフォルト構成」では、MySQL が 1000 の並列「オープン チャネル」しか許可しないことです。その後、新しい接続は拒否されます (この設定は微調整できます)。したがって、たとえば、100 クライアントごとに 20 の Web サーバーがあり、それぞれが 1 時間に 1 ページだけアクセスする場合、簡単な計算で、データベースへの 2000 の並列接続が必要になることがわかります。それはうまくいきません。

エルゴ: リクエストの多いアプリケーションにのみ使用してください。

于 2008-09-09T10:54:49.413 に答える
14

簡単に言えば、私の経験では、永続的な接続は可能な限り避けるべきであると言われています。

mysql_close は、mysql_pconnect を使用して作成された接続に対してノーオペレーション (no-op) であることに注意してください。これは、永続的な接続をクライアントが自由に閉じることができないことを意味します。そのような接続は、接続でwait_timeoutよりも長い間アクティビティが発生しない場合、mysqldb サーバーによって閉じられます。wait_timeoutの値が大きい場合(たとえば 30 分)、mysql db サーバーは簡単にmax_connections制限に達する可能性があります。このような場合、mysql db は今後の接続要求を受け入れません。これは、ポケットベルがビープ音を鳴らし始めるときです。

max_connectionsの制限に達するのを避けるために、永続的な接続を使用するには、次の変数を慎重に調整する必要があります...

  1. 1 つのホスト上の apache プロセスの数
  2. Apache を実行しているホストの総数
  3. mysql db サーバーの wait_timout 変数
  4. mysql db サーバーの max_connections 変数
  5. 再生成される前に 1 つの apache プロセスによって処理されるリクエストの数

そのため、十分に検討の上、固定接続を使用してください。永続的な接続から得られるわずかな利益のために、複雑な実行時の問題を招きたくない場合があります。

于 2010-10-20T13:09:01.770 に答える
4

データベースへの接続の作成は、かなりコストのかかる操作です。持続的接続は良い考えです。ASP.NetとJavaの世界では、「接続プール」があります。これはほぼ同じことであり、良い考えでもあります。

于 2008-09-08T18:03:15.773 に答える
3

IMO、この質問に対する本当の答えは、アプリに最適なものです。永続的な接続と非永続的な接続の両方を使用してアプリのベンチマークを行うことをお勧めします。

Maggie Nelson @ Objectively Orientedが 8 月にこれについて投稿し、Robert Swarthoutが具体的な数字を添えて投稿しました。どちらもかなり良い読み物です。

于 2008-09-08T18:16:39.953 に答える
1

一般に、非永続的な接続を使用する必要がある場合があり、db 接続の設計に適用する単一のパターンがあると便利です (ただし、コンテキストで永続的な接続を使用するメリットが比較的少ない場合に限ります)。

于 2008-11-10T19:09:27.593 に答える
1

私の愚見で:

Web 開発に PHP を使用する場合、ほとんどの接続は、ページが実行されている間だけ「有効」になります。永続的な接続は、セッションなどに接続する必要があるため、多くのオーバーヘッドが発生します。

99% の確率で、ページ実行の最後に終了する単一の非永続接続は問題なく動作します。

残りの 1% の時間は、アプリケーションに PHP を使用するべきではなく、完全な解決策はありません。

于 2008-09-09T13:34:55.083 に答える
0

これと同じ質問をするつもりでしたが、もう一度同じ質問をするのではなく、見つけた情報を追加します。

また、新しい mysqli 拡張機能には、永続的なデータベース接続を使用するオプションさえ含まれていないことにも注意してください。

現時点ではまだ永続的な接続を使用していますが、近い将来、非永続的な接続に切り替える予定です。

于 2008-11-10T19:06:22.810 に答える