[SQL Database] 接続タイムアウトの発生を改善したい


 

高原 伸城
SQL Engine Support Engineer

 

皆さんこんにちは。 SQL Server/Windows Azure SQL Database サポートを担当しております 高原 です。

今回は、Windows Azure SQL Database に関するお問い合わせの中で、よくあるお問い合わせの一つを紹介したいと思います。

[質問]

オンプレミス上のマシン(Web サーバー) や、Windows Azure 上の Web ロールから Windows Azure SQL Database へ接続する場合に、接続タイムアウト (Connection Timeout) が発生する場合があるが、接続タイムアウトの発生を軽減させる方法はあるか?

[回答]

Windows Azure SQL Database へ接続するアプリケーション側で、接続タイムアウト値を延ばす ことにより、接続タイムアウトの発生を軽減させることが可能となります。

Windows Azure SQL Database は、マルチテナント構成となっており、複数のお客様により、Windows Azure SQL Database 物理マシンのリソース (CPU、メモリなど) を共有しています。

そのため、他のお客様が使用しているデータベースへの処理量が一時的に増えるなどの要因により、通常時よりも データベースへの接続に時間を要して、接続タイムアウトが発生するという現象は、発生しうる現象となります。

可能な限り、接続タイムアウトが発生する現象を軽減させるため、弊社としましては、Windows Azure SQL Database へ接続するアプリケーションの場合、以下の設定を推奨しています。

+推奨設定

接続タイムアウト値 (既定 15 秒) を 30 秒以上に設定

接続タイムアウト発生時に、アプリケーション側で接続のリトライ処理を実施するロジックを実装

接続のリトライ処理の間隔は、10 秒 (最低 5秒以上) に設定 (※)

接続のリトライ処理について        
接続タイムアウトエラーが発生した場合、リトライ処理時に接続オブジェクトは使いまわさず、オブジェクトの作成から処理を最実行します。
DbConnection 系のオブジェクトにおいては、Open() からのリトライの場合、接続オブジェクトの状態に問題がある状態からの試行になるため、問題が解消しないことが多くあります。
なお、Entity Framework の場合は、ObjectContext から、Connection オブジェクトのOpen() メソッドをコールすると、内部の SqlConnection クラスを再作成する動作から処理が実行されますので、Open() メソッドからのリトライで構いません。

[参考情報]

SqlConnection.ConnectionTimeout プロパティ

[例] C#

private static void OpenSqlConnection()
{
    string connectionString = GetConnectionString();
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        Console.WriteLine("State: {0}", connection.State);
        Console.WriteLine("ConnectionTimeout: {0}",
            connection.ConnectionTimeout);
    }
}

static private string GetConnectionString()
{
    // To avoid storing the connection string in your code,
    // you can retrieve it from a configuration file, using the
    // System.Configuration.ConfigurationSettings.AppSettings property
    return "Data Source=(local);Initial Catalog=AdventureWorks;"
        + "Integrated Security=SSPI;Connection Timeout=60";
}

接続文字列 (Entity Framework)

[例]

<connectionStrings>

<add name="AdventureWorksEntities"

connectionString="metadata=.\AdventureWorks.csdl|.\AdventureWorks.ssdl|.\AdventureWorks.msl;

provider=System.Data.SqlClient;provider connection string=’Data Source=localhost;

Initial Catalog=AdventureWorks;Integrated Security=True;Connection Timeout=60;

multipleactiveresultsets=true’" providerName="System.Data.EntityClient" />

</connectionStrings>

SQL Azure Connection Management

+ Connection-loss Errors (接続が失われるエラー)

 

Enterprise Library 5.0 Integration Pack for Windows Azure

+ サンプル アプリケーション

※ 本Blogの内容は、2013年2月 現在の内容となっております。


Comments (0)

Skip to main content