2011-01-12 53 views
4

私はmysqlを使って私の最初の仕事をしています。私のアプリケーションが持っている接続をどのように処理するのか疑問に思っています。mysql接続。私はそれを生かしておくか、各トランザクションの前に新しい接続を開始する必要がありますか?

私が今やっていることは、プログラムを終了するまで、接続を開いて生きていることです。私は毎回mysql_ping()を行い、接続はMYSQL_OPT_RECONNECTで開始されます。

もう一つの選択肢は、データベースへの接続が必要なものを実行する前に新しい接続を開始し、それを完了した後で閉じることです。

これら2つのアプローチの賛否両論は何ですか? 長い接続の「副作用」は何ですか? これを処理する最も一般的な方法は何ですか?

乾杯;)


いくつかの余分な詳細

私が生きて接続を維持していると私は今、それが状況だし、すべての今、もう一度それをpingし、必要に応じて再接続し、この時点で。

これにもかかわらず、クエリーとの一貫性のある並行性が連続して発生すると、「サーバーがなくなった」というメッセージが表示され、しばらくして接続が再確立されます。

これは長期接続の副作用か、これがちょうど悪いmysqlサーバ設定のケースであるかどうか疑問に思っています。

アイデア?

+0

これらの「追加情報」については、そのトピックに関する既存の質問をよく調べたり、新しい質問を開いたりしてください。 –

答えて

6

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

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

性能上の理由は別として、プールは需要のピークに備えておくのも良い考えです。多くのリクエストが入ってきて、それぞれがデータベースとの個別の接続を開こうとするとき、またはさらに(トランザクションごとに)提案したように、すぐにリソースが使い果たされます。すべての接続がMySQL内のメモリを消費することに注意してください!

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

0

あなたはどのようなアプリケーションを書いていますか?それがウェブスクリプトの場合:開いたままにしておきます。実行可能ファイルの場合は、接続をプールします(必要に応じて、シングルトンが行うほとんどの時間)。

+0

実行ファイルです。接続をプールすることはどういう意味ですか? –

1

接続数が多すぎる(1,000以上)ことを心配しない限り、接続を開いたままにします。接続や再接続にはオーバーヘッドがあり、物事が遅くなるだけです。あなたはしばらくの間、開いたままに、接続を必要としている知っている場合は、定期的にpingを実行するのではなく、このクエリを実行します。

#がアイドル状態の接続を開いたままにする秒数です
SET SESSION wait_timeout=# 

+0

さて、実際に私は接続をpingしてそれを生かしておきますが、デフォルトのタイムアウトもあります。私はこれが正しい接続を維持することをカバーすると思いますか? –

+0

はい、wait_timeoutを設定すると、その間、接続は「生きている」状態になります。必要に応じて1日(86400)に設定することができます。その後、1日に1回だけpingする必要があります。スクリプトが完了すると、接続は閉じられ、接続は開かれません。 –

関連する問題