7

私は常に、mysql_close()、Propel :: close()などのデータベース/ ORMに関係なく、データベース接続を閉じることが常に良い習慣であると想定していました。

私の他の質問の1つとインターネットに関する他のいくつかの調査を参照すると、ほとんどの人が、要求後に接続が常に閉じられるため、接続を閉じても問題ないと推奨しているという驚くべき顔を知りました。

しかし、私はそれらの答えを消化するのが少し難しいと感じています。理由は、すべてのDB lib、ORMがcloseメソッドを提供する理由です。そこにある場合は、すべてのORM / libで、それをうまく利用する必要があります。

誰かがどのような状況でいくつかの光を当てることができますか?DB接続を閉じるためにcloseメソッドを使用する必要がありますか?&これらのメソッドがまったく役に立たない場合、なぜそれらがすべてのデータベースライブラリ/ORMに存在するのですか?

編集

私の結論

それはBondyeとFluffehの間の良い議論であり、接続を閉じることの使用についての私の疑問を解消しました。両方に感謝します。

  • スクリプトの持続時間が100ミリ秒未満であると予想される場合は、わざわざ接続を閉じないでください。
  • ただし、スクリプトがより長く続くことが予想され、最後のDB操作とスクリプトの終了の間に時間がかかる場合は、* close()を呼び出して他のユーザーの接続を解放してください。

両方の答えがその場所で正しいので、私が1つの答えを受け入れることは本当に非常に難しいです。それが一番上にとどまるように、すべてのコメントで答えを受け入れるだけです。しかし、両方の正解に+1します。

4

4 に答える 4

8

mysql_close()非永続的な開いているリンクはスクリプトの実行の最後に自動的に閉じられるため、通常は使用する必要はありません。

リソースの解放

PHP 4 の Zend Engine で導入された参照カウント システムのおかげで、リソースへの参照がなくなったリソースは自動的に検出され、ガベージ コレクターによって解放されます。このため、メモリを手動で解放する必要はほとんどありません。

これがさらに役立つことを願っています。

ソース

編集:

の目的はmysql_close()コンピューターのリソースを節約することでもありますが、それを使用するもう 1 つの重要な理由は、MySQL サーバーが受け入れることができる接続の数が限られているためです。理由もなく接続を開いているクライアントが複数ある場合、サーバーは他の待機中のクライアントを断る必要があります。当然、これは悪いことなので、 と同様に、データベースを最後に使用してからスクリプトが終了するまでに時間がかかると思われる場合mysql_free_result()は、呼び出すことをお勧めします。mysql_close()

于 2012-09-11T09:27:15.097 に答える
6

データベース接続が不要になった場合は、データベース接続を閉じることをお勧めします。スクリプトの終了後に自動的に閉じられたとしても、それはさらに 1 秒後または数秒後になる可能性があります。必要がなくなった場合、1 人のユーザーがページにアクセスしてデータベース接続を 0.5 秒間浪費しても違いはありませんが、一度に 20 人がそれを行うと、突然 10 秒間の接続が開かれます。それ違いを生みます。

同時に、接続を再利用することをお勧めします。通常、接続を作成して開くには少なくとも数ミリ秒かかります。たとえば、数十万行を挿入する場合、毎回数ミリ秒が実際に加算されます。速い。

ある意味では、変数を NULL に設定することも、設定を解除することも同じです。必ずしもそうする必要はありません、クリーンでエレガントなコードとリソース管理は常に良いことです。

于 2012-09-11T09:26:02.280 に答える
4

データベース接続は無制限ではありません。特に商用データベースソフトウェアには、同時接続の数を比較的少数に制限するライセンスが含まれていることがよくあります。このような状況では、スクリプトがアクティブに使用されなくなったときに接続を閉じる必要があります。PHPは、スクリプトが終了するとデータベース接続を自動的に閉じますが、訪問者がページのダウンロードを完了するまでは閉じません。彼の接続が遅い場合(ダイヤルアップまたはモバイル)、あなたが知っているすべての人にとって、それは10、20秒かかる可能性があります。

于 2012-09-11T10:06:28.977 に答える
0

DoctrineやPropelのようなよく開発されたORMは、MySQL接続を閉じるのに優れています。しかし、ストレートphpを使用している場合は、閉じられていない接続にまでさかのぼってデータベースの問題が多数発生するのを目にしました。各スクリプトの最後ですべてのdb接続を閉じることをお勧めします。

于 2012-09-19T02:00:39.003 に答える