5

私はmysqlを使って最初の試みを行っていますが、アプリケーションの接続を処理する方法に疑問があります。

私が今していることは、接続を開き、プログラムを終了するまで接続を維持することです。私は時々mysql_ping()を実行し、接続はMYSQL_OPT_RECONNECTで開始されます。

もう1つのオプション(私は考えることができます)は、データベースへの接続が必要なことを行う前に新しい接続を開始し、データベースへの接続が完了したら閉じることです。

これら2つのアプローチの長所と短所は何ですか?長い接続の「副作用」は何ですか?これを処理するために最もよく使用される方法は何ですか?

乾杯 ;)


いくつかの追加の詳細

この時点で、接続を維持し、時々pingを実行して、そのステータスになり、必要に応じて再接続します。

それにもかかわらず、クエリが連続して発生する一貫した同時実行性がある場合、「サーバーが終了しました」というメッセージが表示され、しばらくすると接続が再確立されます。

これが長時間の接続の副作用なのか、それともmysqlサーバーの構成が悪い場合なのか疑問に思っています。

何か案は?

4

3 に答える 3

9

一般に、接続を開くときにかなりの量のオーバーヘッドが発生します。これが発生すると予想される頻度によっては問題ない場合もありますが、プログラムの実行ごとにごくわずかなコマンド以上を実行するアプリケーションを作成している場合は、接続プール(サーバータイプのアプリの場合)またはスタンドアロンアプリからの少なくとも1つまたはごく少数の接続をしばらく開いたままにして、複数のトランザクションに再利用します。

これにより、データベースサーバーが関与する前であっても、アプリケーションレベルで開く接続の数をより適切に制御できます。これは、アプリケーションサーバーが提供するサービスですが、小さくしたい場合は、かなり簡単にロールアップすることもできます。

パフォーマンス上の理由は別として、プールは需要のピークに備えて準備することもお勧めします。多くのリクエストが届き、それぞれがデータベースへの個別の接続を開こうとすると、または(トランザクションごとに)さらに多くのリクエストを提案すると、すぐにリソースが不足します。すべての接続がMySQL内のメモリを消費することに注意してください!

また、root以外のユーザーを使用して接続するようにします。そうしないと(MySQLSUPER特権に関連付けられていると思います)、ロックアウトされる可能性があります。MySQLは、問題を修正するために管理者用に少なくとも1つの接続を予約しますが、アプリがその特権で接続する場合、手動で火を消そうとすると、すべての接続がすでに使い果たされています。

于 2011-01-14T10:09:07.957 に答える
2

開いている接続が多すぎる(つまり1,000を超える)ことを心配しない限り、彼女は接続を開いたままにします。接続/再接続にはオーバーヘッドがあり、速度が低下するだけです。しばらくの間接続を開いたままにする必要があることがわかっている場合は、定期的にpingを実行する代わりに、次のクエリを実行してください。

SET SESSION wait_timeout=#

ここで、#はアイドル状態の接続を開いたままにする秒数です。

于 2011-01-12T20:02:21.617 に答える
-1

どんなアプリケーションを書いていますか?Webスクリプトの場合:開いたままにします。実行可能ファイルの場合は、接続をプールします(必要に応じて、ほとんどの場合、シングルトンで実行できます)。

于 2011-01-12T18:58:31.833 に答える