8472


OS:Windows Server 2008 R2  
Server:IIS 7.0

ASP.NET(VB)とMicrosoft SQLServer 2008でWebアプリケーションを構築しています。  
去年にトラブルがあり、OSを再インストールすることとなり、環境が一度まっさらになりました。

それまでは、長時間アクセスが無くても普通にアプリケーションが動作しており、トラブルはありませんでした。  
OS再インストール後、何も問題なく動作していたのですが、長時間アクセスしていないと、必ず一度、データベース接続のタイムアウトが発生し、その後問題なく接続ができる、という状況になっていることが分かりました。  
SQL Server Management
Studioでも、長時間SQLを実行していないと、SQLを実行したときにタイムアウトとなり、再接続が行われ、その後スムーズに動作します。

恐らく、SQLServerの設定で変更すべき部分があるのかと思いますが、SQLServer
アイドル時間、などと探しても思うような資料が得られない状況となります。

ご存知の方おられましたらよろしくお願いいたします。

-2015/03/04 13:35  
追記：接続コード  

[code]

    <%@ import Namespace="Microsoft.VisualBasic.FileIO" %>
    <%@ import Namespace="System.Data" %>
    <%@ import Namespace="System.Data.SqlClient" %>
    <%@ import Namespace="System.Type" %>
    <%@ import Namespace="System.IO" %>
    <%@ import Namespace="System.Security" %>
    <%@ import NameSpace="System.Security.Cryptography" %>
    <%
     Dim dbConnection as sqlconnection = new sqlconnection("Server=[ADDR];UID=[ID];PWD=[PASS];Database=[DBNAME];")
     Dim sql as String
     Dim result as Integer
     Dim cmd as sqlCommand
     Dim dbRead as sqlDataReader
     dbConnection.open() ' ここでタイムアウトエラー
    %><!doctype html>
    -中略-
    <%
     dbConnection.close()
    %>
[/code]

-2015/03/30 追記  
回答に追加を頂き、試してみたところ、まさにこれだという内容でした。  
参考先サイトによると

[code]

    sp_dboption DBNAME
    
[/code]

として実行すると、 autoclose が含まれる場合があり、これがあると自動終了になるようです。  
ですので、次のコマンドでこれを取り払います。

[code]

    ALTER DATABASE DBNAME SET auto_close OFF
    
[/code]

以上です。


CC BY-SA 3.0
2015-03-04T02:34:11.347
7405
2022-06-02T11:47:16.670
2015-03-30T02:49:11.990
8667
8667
question
sql-server
SQLServer2008が長時間アクセス無い場合スリープ(?)してしまう


現時点でできそうな事を書いてみます。  
1つ目としては、例外を捕捉して詳しい情報を調べてみてはどうでしょうか。

[code]

    Using dbConnection As New SqlConnection("Server=[ADDR];UID=[ID];PWD=[PASS];Database=[DBNAME];")
        Try
            dbConnection.open
        Catch ex As SqlException
            // ex.Message に原因が書いてあります
        End Try    
        // 実際の処理 (Try中に書いても良いですが例外が発生しないならここで)
    End Using
    
[/code]

(`Using`を使うことで、スコープを抜ける時に自動的に`dispose()`が呼ばれるようになります。必ず必要なわけではありませんが、より安全な書き方のため載せておきます。)  
得られたエラーメッセージを元に、サーバー側の原因がわかるかもしれません。  
cf. [Troubleshooting Connectivity #4 - 接続エラーの調査方法 - Microsoft SQL Server Japan
Support Team Blog - Site Home - MSDN Blogs](https://docs.microsoft.com/en-
us/archive/blogs/jpsql/troubleshooting-connectivity-4)

2つ目として、`Management Studio`で接続し、`オブジェクトエクスプローラ`内で該当DBのツリーを開き、`管理`→`SQL
Serverログ`からDB側のログを直接見てみると詳しい情報が得られるかもしれません。

* * *

余談：あまり数少ない経験ですが

  * サーバーが物理的に不調になってきている。
  * 仮想サーバで動いていて、物理サーバの負荷が増大している
  * 同じサーバ上にある別のDBの負荷が増大している

といった場合に、簡単なクエリでも接続タイムアウトが発生することはありました。


CC BY-SA 4.0
2015-03-04T05:37:37.977
7418
2021-01-13T12:21:29.190
2021-01-13T12:21:29.190
19769
3313
7405
answer


Express Editionをお使いでしょうか。  
Expressにのみ「アイドル時は積極的にメモリを開放しディスクに書き戻す」仕様があります。  
これを設定で調整することはできず、解決するには上位のEditionに切り替えるしかありません。

[Understanding SQL Express behavior: Idle time resource usage, AUTO_CLOSE and
User
Instances](https://web.archive.org/web/20151120042057/http://blogs.msdn.com:80/b/sqlexpress/archive/2008/02/22/sql-
express-behaviors-idle-time-resources-usage-auto-close-and-user-
instances.aspx)

接続タイムアウトを十分に長くするか、定期的なポーリングでアイドルからできるだけ復帰させるという緩和策をお勧めします。


CC BY-SA 4.0
2015-03-04T05:42:45.827
7419
2022-06-02T11:13:56.027
2022-06-02T11:13:56.027
3060
2238
7405
answer


データベースのプロパティに"自動終了"という項目があります。

[SQL Server 2008
ExpressEditionでのデータベースの"自動終了"オプション](http://kenichiro22.hatenablog.com/entry/20101116/1289901540)

当方にすぐ確認出来るSQL Server 2008 Expressが無かったので、直接確認できてませんが、上記URLのページだと設定変更出来ています。


CC BY-SA 4.0
2015-03-27T05:34:41.877
8472
2022-06-02T11:47:16.670
2022-06-02T11:47:16.670
3060
3446
7405
answer