2009-11-10 23 views
12

セッション全体を通して接続を開いたままにしておくことは賢明ですか? 私はMySqlデータベースに接続するC#アプリケーションを作成しました。プログラムは読み書きしており、アプリケーションはノンストップで約10時間実行しなければなりません。MySql接続を開いたままにすることはできますか?

データベースから何かを引き抜き、新しいものが必要なときに再び開くときに、毎回close()関数を呼び出すのではなく、接続を開いたままにするというリスクはありますか?

答えて

8

は限り、罰金です:あなたはMySQLの接続制限を打つように多くの並行アイドル状態の接続を持っていない

  1. 何もせずに時間のままにしないでください。デフォルトのMySQL接続wait_timeoutは8時間です。その間、接続を非アクティブにしておくと、次に使用するときに「MySQLサーバーがなくなった」というエラーが表示されます。

+2

接続を開いたままにしておくと、実際には何も得られません(プロバイダーが接続プールを使用していると仮定します)。公式のMySQL Connector/Netプロバイダは、デフォルトで接続プールを使用します。営業担当者は実際に使用しているプロバイダについては言及していませんが、プーリングをサポートしている場合は、オープンなレイト/クローズ・アーリー・ストラテジーを使用し、プロバイダーに基盤となる物理接続を管理させます。 – LukeH

+0

申し訳ありませんが、古いスレッドのコメントを追加しています。私はhttp://download.oracle.com/javadb/10.3.3.0/devguide/cdevconcepts89498.htmlを読んで、あなたのアプリケーションがマルチスレッド/トランザクションを持っているかのように思えますが、各スレッドを別個の接続に割り当てることをお勧めします。ありがとう。 –

0

アプリケーションが接続を使用している場合、それを閉じる理由はありません。接続が必要ない場合は、接続を閉じる必要があります。複数のアプリケーションをデータベースに接続する場合、そのデータベースへの接続数は固定されています。それが終わったら閉じて、必要なときにもう一度開くのが良い理由です。しばらくの間、接続を開いたままに

0

セキュリティの観点からは、開いた接続に他のプログラムを挿入することができないようにするために、クエリを終了することをお勧めします。

パフォーマンスが向上しているので、全体的に開いている方が明らかです。

お好み^^

9

あなたがADO.NETを使用しているので、あなたが機能をプーリングADO.NETの作り付けの接続を使用することができます。実際には、私はそれを洗練させてください:は常にADO.NETのinbuilt接続プーリング機能を使用する必要があります。これにより、バックグラウンドで接続を透過的に管理する.NETランタイムを取得できます。たとえあなたがそれらを閉じていてもしばらく接続を開いたままにしておき、新しい接続を開くと再利用します。これは本当に速いものです。

デフォルトの動作ではない可能性があるため、プールされた接続を接続文字列に記述してください。

新しい接続を作成するにはオーバーヘッドがありませんので、彼らはbackrgoundにプールしているので、あなただけ、あなたがそれらを必要なときにローカル接続を作成する必要があります。

using (var connection = SomeMethodThatCreatesAConnectionObject()) 
{ 
    // do your stuff here 
    connection.Close(); // this is not necessary as 
         // Dispose() closes it anyway 
         // but still nice to do. 
} 

あなたがそれを行うことになっている方法ですこと.NETで。

0

いいえ、私はそれを開いている接続を終了して再使用しない理由は何らかの理由が表示されない:結局のところ、これは約あるさまざまな接続プールの技術の背後にある全体のポイントである(これらは一般的に予約されていますが、作業がすべて同じデータソース上で動作しているマルチスレッドの場合)。

しかし、bobinceの回答を拡大するには、接続を終了しないでください。接続がタイムアウトする可能性があります。接続に問題がある可能性があります。あなたの接続が死ぬ理由。接続が存在しないと想定し、この例外の場合のロジックにコードを追加する必要があります。

0

私の意見では、接続を開いたままにするのは良い方法ではありません。 毎回接続を閉じることを表す別の側面は、スケーラビリティです。今は開いたままにしても大丈夫かもしれませんが、アプリの使用量がユーザーの3倍の2倍であればどうでしょうか?首に戻ってすべてのコードを変更するのは痛みです。 (私はそれをやったことを知っています:-)

0

コードで接続プーリングを使用すると問題は解決します。接続を開いたり閉じたりする必要がないため、接続を開いている間に使用される貴重なリソースを節約できます。接続の要求時にアイドル接続を返すプールへの接続を返します。

もちろん、私は、接続のインスタンスを取得し、それを使用して、作業をコミット/ロールバックしてプールに戻します。私は長い間コネクションを開いたままにしておくことを勧めません。

0

他の回答では一度も見たことがありません:文やテンポラリテーブルを準備している場合は、接続が閉じられるまでサーバーリソースをブロックする可能性があります。しかし、一方では、数分ごとに接続を再作成するのではなく、しばらくの間接続を維持すると便利です。

0

接続を常に開いたり閉じたりすると、パフォーマンスが低下します。アプリケーションの実行コピーが多すぎるとデータベース接続が多すぎると懸念される場合は、接続プーリングと短いwait_timeoutを使用することをお勧めします。

+0

これはそうではありません。これが実行されている唯一のアプリケーションで、何も接続しようとする必要はありません。 – Pieter888

+1

この場合、接続を切断すると聞いたことはありません。あなたのアプリケーションが自動的かつ透過的に接続を再確立することができれば、追加のセキュリティは提供されません(それぞれの認証が少しの情報を公開するため、 接続プーリングと呼ばれる一般的な組み込み機能では、コードを閉じるように指示しても接続が開いたままになるため、認証のオーバーヘッドがなくても別のプロセスで接続を再利用できます。 – MightyE

+0

接続が* open *のときに自動的に再接続されますか?または、それを検出するために私自身のコードを書く必要がありますか? – Pieter888

0

はいすることができます提供:

  • をあなたが接続
  • を失う場合は、何か奇妙なが
  • を発生した場合、接続は「静かなる」場合は、検出します接続状態をリセットすることができます再接続されますたとえば、ファイアウォールのタイムアウトが発生した場合など。

基本的に、障害の発生や正しい復旧には十分注意が必要です。接続と切断はしばしば簡単です。

0

接続プーリングのメカニズムがある場合は、接続を閉じるほうがよいでしょう。

あなたの接続がまだ生きているかどうか再確認する必要はないという理由の1つです。

関連する問題