none
接続プールが複数作成される RRS feed

  • 質問

  • いつもお世話になっております。
    C#2010で開発しています。

    データベースへの接続をするプログラムを作成しているのですが、
    稀に接続プールが複数作成されます。
    プログラムは次のような感じです。

    private void button1_Click(object sender, EventArgs e)
    {
    	using (OdbcConnection connection = new OdbcConnection(CONNECTION_STRING))
    	{
    		connection.Open();
    		// 省略
    	}
    }


    省略箇所においては、SELECTしかしていません。
    プログラムの仕様上、本ボタンは1秒以内に数回押下されることがあります。

    本ボタンを連続して何度もクリックした場合に、
    接続プールが1つだけ作成される場合と2つ以上作成される場合がございます。
    最大で5つまで作成されました。
    (DBMSはDB2ver8を利用しています)

    これで不具合が発生している、というようなことはないのですが、
    接続プールを1つだけにできないだろうかと思っております。
    クライアントが1000台以上あり、
    DBへの負荷は少しでも少ないほうが望ましいと思うので・・・。

    そこで質問なのですが、接続プールが複数作成されないようにできないでしょうか。
    usingを一度抜けているので、次にOpenしようとしても、
    すでに存在する接続プールを利用してほしいのです。

    ただし、プログラムの性質上、SELECTごとにCloseはしたいです。
    もし解決方法をご存知でしたら、ご教示頂きたく存じます。

    以上、よろしくお願い致します。


    2013年2月18日 6:42

回答

  • 接続プールを1つだけにできないだろうかと思っております。
    クライアントが1000台以上あり、
    DBへの負荷は少しでも少ないほうが望ましいと思うので・・・。

    先のやり取りで、前提となっている「接続プール」について質問者さんが理解されていないように見受けられました。

    そもそも接続・切断というのはOS層、ネットワーク層、DBサーバー・クライアント双方に多大な負荷をかけます。接続プールとは、多数の接続を行うぐらいなら使わなくなった接続を残しておき、再度使用したいときにreset connectionするだけで新規接続と同等のものを得るための、いわば負荷を下げるための機能です。

    その上で、「こまめに接続・切断を繰り返し、接続数そのものを削減すること」「ある程度接続を残し、接続・切断回数を削減すること」どちらを望まれますか?

    …と書いておきながら、OdbcConnectionでは接続プールの使用が強制されるようで、選択権はなさそうです。もし制御したいのであれば、Db2Connectionを使いましょう。

    • 回答としてマーク コンドル 2013年2月19日 3:06
    2013年2月18日 23:29

すべての返信

  • 少し補足します。

    実装しているプログラムは、スケジュール表のようなアプリケーションになります。
    月次のデータを表示しており、「←」ボタンをクリックすると前月に移動するような処理があります。

    3ヶ月前に戻りたい場合には、ボタンを3回クリックする必要があり、必然的にボタンが連打されてしまいます。
    しかし、至って普通の操作だと思っております。

    ボタンが3度連打されると、3ヶ月前の表示になっており、アプリケーションとしては意図した動作はしております。

    その上で、接続プールが最小限の数で動作できたら望ましいと思い、質問させて頂きました。

    ご教示頂ければ、幸いでございます。
    よろしくお願い致します。
    • 編集済み コンドル 2013年2月18日 7:09 動作⇒操作
    2013年2月18日 7:08
  • 確認ですが、接続プールの数について言及されていますが、どのように数えたのでしょうか?
    2013年2月18日 7:12
  • 佐祐理さん

    ご回答ありがとうございます。

    DB2を利用しており、DB2のコマンドに「list applications show detail」という
    コマンドがございます。
    このコマンドでは、現在DBに接続しているコネクションのリストを確認することができます。
    接続している端末名やアプリケーション名(Exe名)まで取得できます。

    この機能を利用し、同一端末内の同一アプリケーションから複数接続されている
    ことを確認しました。

    もちろん確認前には接続がないことを確認し、
    当該処理だけを行った結果として接続が複数になっていることを確認しております。

    また、試しにReleaseObjectPoolメソッドを呼ぶと、当該端末の当該アプリケーションからの
    接続数が0になっており、接続数の確認方法としては間違っていないと考えております。

    OdbcConnection.ReleaseObjectPool メソッド (System.Data.Odbc)
    http://msdn.microsoft.com/ja-jp/library/system.data.odbc.odbcconnection.releaseobjectpool(v=vs.100).aspx


    よろしくお願い致します。


    2013年2月18日 7:18
  • 説明していただきましたが、その説明内に「接続プール」の語がそもそも含まれていません。説明を聞く限り、「接続プール」が有効に機能し、複数の「接続」がなされているだけにしか見えませんが。本当に「接続プールが複数作成される」という質問タイトルで正しいのですか?

    2013年2月18日 7:31
  • 佐祐理さん

    そうですね、私の説明も理解も足りなかったかもしれません。

    ConnectionをCloseしてもDB2の接続リストには残っており、
    一定時間経過後に接続リストから消えるような動作が確認できております。

    ConnectionはCloseしていることから、DB2上で残っている
    「接続」は「接続プール」が複数作成されていることが原因だと
    「勝手に」思い込んでおりました。

    実際には複数の「接続」がされているのだと思います。

    繰り返しの説明になるかもしれませんが、
    ボタンのクリックを1秒おきくらいに行っても、DB2からの接続は1件しか見られません。
    連続して行った場合に、稀に複数の接続状態になっております。

    この現象であるDB2から見た複数の接続を1件だけにできないだろうかと
    思い、質問させて頂いております。

    説明に間違いがあり、お手数お掛けしました。

    引き続き、ご回答頂けましたらよろしくお願い致します。
    2013年2月18日 8:20
  • 接続プールを1つだけにできないだろうかと思っております。
    クライアントが1000台以上あり、
    DBへの負荷は少しでも少ないほうが望ましいと思うので・・・。

    先のやり取りで、前提となっている「接続プール」について質問者さんが理解されていないように見受けられました。

    そもそも接続・切断というのはOS層、ネットワーク層、DBサーバー・クライアント双方に多大な負荷をかけます。接続プールとは、多数の接続を行うぐらいなら使わなくなった接続を残しておき、再度使用したいときにreset connectionするだけで新規接続と同等のものを得るための、いわば負荷を下げるための機能です。

    その上で、「こまめに接続・切断を繰り返し、接続数そのものを削減すること」「ある程度接続を残し、接続・切断回数を削減すること」どちらを望まれますか?

    …と書いておきながら、OdbcConnectionでは接続プールの使用が強制されるようで、選択権はなさそうです。もし制御したいのであれば、Db2Connectionを使いましょう。

    • 回答としてマーク コンドル 2013年2月19日 3:06
    2013年2月18日 23:29
  • DB2は全く使ったことがないのですが、とりあえずConnectionStringに関して調べてみてはどうですか?

    http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=%2Fcom.ibm.swg.im.dbclient.adonet.ref.doc%2Fdoc%2FDB2ConnectionClassConnectionStringProperty.html

    2013年2月19日 1:31
  • 佐祐理さん、かるあさん

    ありがとうございました。

    OdbcConnectionを使っている以上、
    このような動作になることは致し方ないようですね。

    基本的には連続操作しないことが多いため、「接続」はなるべく減らしておきたいです。
    そうなると、こまめにConnectionをCloseする必要があると、理解しております。

    その反面、ある程度続けて操作することも多いため、
    接続プールを強制的に解放してしまうことはしたくないです。

    しかし、それによって連続操作によって「接続」が増えてしまうことがあります。
    私としては少し残念に思っておりますが、
    OdbcConnectionを利用する限り、仕様と言える動作であるため、回避不能というところですね。
    理解しました。

    DB2Connectionの利用については検討してみます。
    また、かるあさんからの回答のConnectionStringも調査してみます。
    いずれもしても、.NETというよりはDB2側の機能を利用しなければ、対応が難しそうということですね。

    大変参考になりました。
    OdbcConnectionを利用している限り、一般的な動作なのだと理解できましたので、それだけでもとても安心できました。

    ありがとうございました。

    2013年2月19日 3:06