none
SQLServer2008R2のセッションの有効期限について RRS feed

  • 質問

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

    SQLServer2008R2のセッションの有効期限について質問させてください。

    SQLServer2008R2にアプリケーションなどから接続する際に確立される
    セッションに有効期限などはありますでしょうか?
    (確立されたセッションが自動的に切断されるまでの時間・期間)

    もしあるようでしたら、その値(時間)はどこで確認できますでしょうか?
    また、変更することはできますでしょうか?

    些細なことでも構いませんので、
    何か情報をお持ちの方がいらっしゃいましたらご教授いただけると幸いです。

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

    2014年12月25日 4:53

回答

  • SQL Server の時間関連の制限ですと、色々あります。

    1.接続が確立するまでの時間に関するタイムアウト
    コネクションタイムアウトなどと呼ばれます。
    クライアント側で制御するものであり、SQL Server 側は関知しません。
    接続が成功した後は、SQL Server 側は接続を維持しますが、より厳密には TCP の keep alive などの仕組みを使って接続が維持されます。
    TCP のレベルでタイムアウトとなると TDS が切断されることは可能性としてあり得ますが、SQL Server ではなく TCP やネットワークのお話になります。
    SQL Server でのお話としては基本的には切断するのはクライアント側の責任になります。

    2.実行中のクエリが完了するまでの処理時間に関するタイムアウト
    コマンドタイムアウトやクエリタイムアウトなどと呼ばれます。
    クライアント側で制御するものであり、SQL Server 側は関知しません。
    処理時間がどんなにかかろうとも、SQL Server 側の特定の条件に抵触しない限りは SQL Server 自身は処理を続けます。

    3.一連のトランザクションが完了するまでの処理時間に関するタイムアウト
    トランザクションタイムアウトなどと呼ばれます。
    クライアント側でトランザクション制御を行っている(例えば .NET で TransactionScope クラスを使用している)場合に、クライアント側で制御するものであり、SQL Server 側は(たぶん)関知しません。

    その他、処理中に SQL Server 側でデッドロック監視に抵触した場合に強制的に処理がキャンセルされることがあるなど、異常時に復旧するための仕組みがいくつか時間制限の側面を持っていますが、正常な処理では考慮する必要が無いので、割愛します。

    このように接続のタイムアウトというのは、基本的にはクライアント側のお話になります。
    何か予期しない形での切断が起きているのであれば、基本的にはクライアント側の実装や挙動を調査されるのが先ずはよろしいかと思います。
    クエリの実行中に SQL Server 側から切断されるようであれば、デッドロックの監視か何かに引っかかっていますので、詳細な状況がわからない事にはお答えしようがありません。

    なお、蛇足ですが、SQL Server の世界では接続を Session と称し、接続情報は sys.dm_exec_sessions で取得できるなど SQL Server 内部の用語として定着しています。
    ただし、「セッション」は多義語で文脈依存になりやすく、また日本の SQL Server 界隈では「接続」や「コネクション」と称することが多いので、私は「セッション」という表現を避けることがあります。
    Oracle 界隈の方とお話しするときは「セッション」でも通じる印象ですので、方言みたいなものでしょうかね。
    海外の方とお話しするときは「Session」でも「Connection」でも通じる印象です。

    MCITP(Database Developer/Database Administrator)

    2014年12月27日 9:25

すべての返信

  • データベースには非接続型と接続型があります。非接続型はクエリ毎に接続・切断を繰り返しますが、接続型はトランザクション中は接続しっぱなしです。

    SQL Serverでは両方をサポートしてるため、切断についてはクライアント任せであり、能動的に切断することはないと思いますが…。

    2014年12月25日 5:03
  • > SQLServer2008R2にアプリケーションなどから接続する際に確立される
    > セッションに有効期限などはありますでしょうか?
    > (確立されたセッションが自動的に切断されるまでの時間・期間)

    ひょっとして、質問者さんが言われる「セッション」というのは SQL Server とは直接関係ない ASP.NET のような Web アプリケーションの Session もしくは認証チケットのことですか?

    SQL Server にそのようなものがあるとすると、自分はセッション状態モードの SQLServer モード(それも主に ASP.NET 側の機能)ぐらいしか思い浮かびません。(自分が知らないだけという可能性は否定できませんけど)

    セッション状態モード
    http://msdn.microsoft.com/ja-jp/library/ms178586(v=vs.100).aspx


    • 編集済み SurferOnWww 2014年12月25日 5:12 一部追加
    2014年12月25日 5:10
  • 普通にSQL Serverへの接続をセッションといっているイメージだと思います。

    ※DB接続をセッションというのは、特殊な言葉の使い方ではなく、一般に使われる言葉だと思います。

    接続確立後、SQL Serverに対して何の操作も行わなかった場合(あるいは操作を行っている場合でも)、自動切断される(接続セッションが破棄される)ようなタイムアウトがあるのか、あるいはないのか、という感じの話だと思います。

    たとえばAzure上のDB接続には、確かタイムアウトがあったはずです。

    普通に立てているSQL Serverの場合にどうだったかはちょっと覚えてないのですが。

    分散トランザクション(DTC)を使っている場合などは、トランザクション側でのタイムアウトがあったりもしますね。

    • 編集済み なちゃ 2014年12月26日 10:43
    2014年12月26日 10:41
  • >佐祐理 様

    返信が遅くなり申し訳ありません。
    コメントありがとうございました!

    はい。いわゆる接続型で確立されたセッションのことになります。

    私も本件について調べてみた感じでは特に明記されている文書が見つけられなかったので、
    サーバ側で切断することは無い(無期限)のではないかな~とは思っているのですが、
    何か根拠となるような情報が無いかと質問させて頂いた次第です。

    もし何か参考になる文書などご存じでしたら教えて頂けると助かります。
    (特にお心当たりなければスルーしてください)

    2014年12月26日 12:34
  • >SurferOnWww 様

    返信が遅くなり申し訳ありません。
    コメントありがとうございました!

    参考情報へのリンクまで付けて頂いて助かります。

    一応SQLServer自身への接続時のセッションのことで質問させて頂いておりました。
    説明不足で誤解を招いてしまい申し訳ありません。

    ASP.NETにはあまり詳しく無かったのでこちらの情報も参考になりました。

    2014年12月26日 12:34
  • >なちゃ 様

    フォローありがとうございます。
    補足して頂いた内容のとおりです。

    なるほど、AzureでのDB接続ではタイムアウトがあるのですね。
    それなら設定項目もあるのかもしれませんね。

    もう少し調べてみます。
    貴重な情報をありがとうございました!

    2014年12月26日 12:35
  • > 一応SQLServer自身への接続時のセッションのことで質問させて頂いておりました。

    その「セッション」の意味が分からないのですが、もう少し具体的に定義できませんか?

    例えば、呼び出し元がプールから接続を取得してから、その接続をプールに戻すまでが、質問者さんの言われる「セッション」ということで良いのでしょうか? で、質問はそれに制限時間はないかということですか?

    理解が違っていたら指摘ください。

    理解が合っているとして、自分が調べた限りですが、制限時間があるという文書は見つけられませんでした。少なくとも接続文字列で設定できるようなものではないはずです。

    SQL Server の接続プール (ADO.NET)
    http://msdn.microsoft.com/ja-jp/library/8xx3tyca(v=vs.110).aspx

    SqlConnection.ConnectionString プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlconnection.connectionstring(v=vs.110).aspx

    これも、自分が見つけられなかっただけ、知らないだけという可能性は否定できませんので、他の方の回答もお待ちください。

    2014年12月26日 17:06
  • SQL Server の時間関連の制限ですと、色々あります。

    1.接続が確立するまでの時間に関するタイムアウト
    コネクションタイムアウトなどと呼ばれます。
    クライアント側で制御するものであり、SQL Server 側は関知しません。
    接続が成功した後は、SQL Server 側は接続を維持しますが、より厳密には TCP の keep alive などの仕組みを使って接続が維持されます。
    TCP のレベルでタイムアウトとなると TDS が切断されることは可能性としてあり得ますが、SQL Server ではなく TCP やネットワークのお話になります。
    SQL Server でのお話としては基本的には切断するのはクライアント側の責任になります。

    2.実行中のクエリが完了するまでの処理時間に関するタイムアウト
    コマンドタイムアウトやクエリタイムアウトなどと呼ばれます。
    クライアント側で制御するものであり、SQL Server 側は関知しません。
    処理時間がどんなにかかろうとも、SQL Server 側の特定の条件に抵触しない限りは SQL Server 自身は処理を続けます。

    3.一連のトランザクションが完了するまでの処理時間に関するタイムアウト
    トランザクションタイムアウトなどと呼ばれます。
    クライアント側でトランザクション制御を行っている(例えば .NET で TransactionScope クラスを使用している)場合に、クライアント側で制御するものであり、SQL Server 側は(たぶん)関知しません。

    その他、処理中に SQL Server 側でデッドロック監視に抵触した場合に強制的に処理がキャンセルされることがあるなど、異常時に復旧するための仕組みがいくつか時間制限の側面を持っていますが、正常な処理では考慮する必要が無いので、割愛します。

    このように接続のタイムアウトというのは、基本的にはクライアント側のお話になります。
    何か予期しない形での切断が起きているのであれば、基本的にはクライアント側の実装や挙動を調査されるのが先ずはよろしいかと思います。
    クエリの実行中に SQL Server 側から切断されるようであれば、デッドロックの監視か何かに引っかかっていますので、詳細な状況がわからない事にはお答えしようがありません。

    なお、蛇足ですが、SQL Server の世界では接続を Session と称し、接続情報は sys.dm_exec_sessions で取得できるなど SQL Server 内部の用語として定着しています。
    ただし、「セッション」は多義語で文脈依存になりやすく、また日本の SQL Server 界隈では「接続」や「コネクション」と称することが多いので、私は「セッション」という表現を避けることがあります。
    Oracle 界隈の方とお話しするときは「セッション」でも通じる印象ですので、方言みたいなものでしょうかね。
    海外の方とお話しするときは「Session」でも「Connection」でも通じる印象です。

    MCITP(Database Developer/Database Administrator)

    2014年12月27日 9:25
  • nagino さん>

    有難うございました。勉強になります。

    2014年12月27日 10:02