none
SQL Serverとのコネクションを閉じないとKeep Aliveが維持される RRS feed

  • 質問

  • いつもお世話になっております。

    SQL Serverとの接続をずっと開いたまま(常にConnection.OpenのままConnection.Close処理を行わない)の処理を行った際にWireSharkなどのパケットキャプチャで通信を見ていると、定期的にTCP Keep Aliveで通信しているようにみえます。また、TCP Keep Aliveはサーバ側とクライアント側、双方から別々に通信してるように確認でき、

    各通信はサーバ側だと、SQL Server構成マネージャ-SQL Server ネットワークの構成-TCP/IP-Keep Aliveの値を変更すると、サーバ側→クライアント側の通信頻度

    クライアント側からだと、同じくSQL Server構成マネージャ-SQL Server Native Client 11.0の構成のTCP/IP-Keep Aliveの値がクライアント側→サーバ側の通信頻度が変更されるのですが

    クライアント側に再配布可能なSQL Server Native Client を配布する場合、SQL Server構成マネージャがインストールされないので、変更したい場合どのように設定すればいいのでしょうか?

    よろしくお願いします。

    ・環境
    OS:Windows7 64bit
    開発環境:VisualStudio2010

    SQLServer: SQL Server 2012

    ソースプログラム       

        OleDbConnection dbconnection = new OleDbConnection();

            public Form1() {
                InitializeComponent();
                this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
                dbconnection.ConnectionString = "Provider=SQL Server Native Client 11.0; 略"
                dbconnection.Open();
            }
            void Form1_FormClosing(object sender, FormClosingEventArgs e) {
                dbconnection.Close();
            }

    ・Wiresharkのログ

    "No.","Time","Source","Destination","Protocol","Length","Info"

    "45771","2015-06-11 00:43:54.673371000","クライアントIP","サーバIP","TCP","55","[TCP Keep-Alive] [TCP segment of a reassembled PDU]"
    "45772","2015-06-11 00:43:54.676712000","サーバIP","クライアントIP","TCP","66","[TCP Keep-Alive ACK] 1433 > 51148 [ACK] Seq=7975 Ack=20649 Win=65536 Len=0 SLE=20648 SRE=20649"
    "45779","2015-06-11 00:43:55.281792000","サーバIP","クライアントIP","TCP","60","[TCP Keep-Alive] 1433 > 51148 [ACK] Seq=7974 Ack=20649 Win=65536 Len=1"
    "45780","2015-06-11 00:43:55.281832000","クライアントIP","サーバIP","TCP","66","[TCP Keep-Alive ACK] 51148 > 1433 [ACK] Seq=20649 Ack=7975 Win=65280 Len=0 SLE=7974 SRE=7975"





    • 編集済み qpopper02 2015年6月10日 15:54
    2015年6月10日 15:48

回答

  • Keep Alive の設定値はレジストリに保持されています。
    手元の環境では以下に設定されていました。

    32bit 環境
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client]
    64bit 環境
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client]
    [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Client]

    ただしレジストリを直接変更するのはサポート外と考えられますし、このレジストリ値のみで実際の Keep Alive の間隔が決まっているかどうかは分かりません。
    あくまで参考、自己責任でお願いする限りです。

    あとは SQL Server 構成マネージャで設定変更した際の挙動を Process Monitor あたりで追うという手もありますが、リバースエンジニアリングとの境界領域に近い話になってくるので、オープンな場ではこれ以上は差し控えます。


    MCITP(Database Developer/Database Administrator)


    2015年6月11日 14:21
  • HKLM\Software\Microsoft\MSSQLServer\Client\SNI11.0\tcp\Property[N]\Value
    あたりをいじる手でしょうか。

    jzkey

    • 回答としてマーク qpopper02 2015年6月12日 10:53
    2015年6月11日 14:24
  • 設定はレジストリに格納されているようですが、naginoさんもコメントされていますが、調査能力も含めて自己責任です。

    それよりは構成マネージャーで設定を行うか、不必要な接続は随時Closeを行い、またTCP/IPについても切断したいのであれば接続プールも無効化するなど、別のアプローチをお勧めします。

    余談ですが、Keep-Aliveパケットがサーバー帯域に影響を与えているとは思えません。80 20の法則からすれば、サーバー帯域の80%を占める何かが存在するはずであり、それを対処すべきです。

    • 回答としてマーク qpopper02 2015年6月12日 10:53
    2015年6月12日 0:30

すべての返信

  • 質問のタイトルと本文とて微妙に異なりますが、Keep-Alive間隔を調整する目的は何でしょうか?

    また質問とは直接関係ありませんが、OLE DBには接続プール機能があります。論理的な接続(OleDbConnectionインスタンスのOpen / Close)とTCP/IPの接続とが一致するわけではありません。そのため一概には言えませんが、挙げられたコードのように論理的な接続を開きっぱなしにするのではなく、DBアクセスするタイミングでOpen / Closeすることが推奨されます。もちろんプールですから複数の接続が用意されてしまったり、再接続に時間を要したりといった問題もありますので使用するかどうかは各アプリケーションに委ねられます。質問文からは接続プールを理解した上で開きっぱなしとなっているのかが判断できませんので指摘しました。

    2015年6月10日 23:09
  • 返信ありがとうございます。

    Keep-Alive間隔を変更したいのは、サーバ側の帯域があまりとれないため、できれば間隔を伸ばしたいためだからです。

    接続プールについては恥ずかしながら存じ上げませんでした。確かにClose処理を行ってもTCP/IPの接続は確認できました。その後、しばらくしてTCP/IPの通信を終了したのを確認できました。論理的な接続を開きぱなしのまま続行する場合はこの問題は回避できないのでしょうか?

    • 編集済み qpopper02 2015年6月11日 12:16
    2015年6月11日 11:22
  • Keep Alive の設定値はレジストリに保持されています。
    手元の環境では以下に設定されていました。

    32bit 環境
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client]
    64bit 環境
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client]
    [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Client]

    ただしレジストリを直接変更するのはサポート外と考えられますし、このレジストリ値のみで実際の Keep Alive の間隔が決まっているかどうかは分かりません。
    あくまで参考、自己責任でお願いする限りです。

    あとは SQL Server 構成マネージャで設定変更した際の挙動を Process Monitor あたりで追うという手もありますが、リバースエンジニアリングとの境界領域に近い話になってくるので、オープンな場ではこれ以上は差し控えます。


    MCITP(Database Developer/Database Administrator)


    2015年6月11日 14:21
  • HKLM\Software\Microsoft\MSSQLServer\Client\SNI11.0\tcp\Property[N]\Value
    あたりをいじる手でしょうか。

    jzkey

    • 回答としてマーク qpopper02 2015年6月12日 10:53
    2015年6月11日 14:24
  • 設定はレジストリに格納されているようですが、naginoさんもコメントされていますが、調査能力も含めて自己責任です。

    それよりは構成マネージャーで設定を行うか、不必要な接続は随時Closeを行い、またTCP/IPについても切断したいのであれば接続プールも無効化するなど、別のアプローチをお勧めします。

    余談ですが、Keep-Aliveパケットがサーバー帯域に影響を与えているとは思えません。80 20の法則からすれば、サーバー帯域の80%を占める何かが存在するはずであり、それを対処すべきです。

    • 回答としてマーク qpopper02 2015年6月12日 10:53
    2015年6月12日 0:30
  • 返信ありがとうございます。

    確認してみます。この度はありがとうございました。

    2015年6月12日 10:53