エクスポート (0) 印刷
すべて展開

方法:ADO.NET を使用して Azure SQL Database に接続する

更新日: 2014年11月

Microsoft Azure SQL Database に接続するには、ADO.NET を使用します。内部設置型の接続とは異なりは調整や、接続を終了または新しい接続を一時的にブロックするその他のサービス エラーを考慮する必要があります。このような状況は一時的な障害と呼ばれます。一時的な障害を管理するには、再試行戦略を実装します。Azure SQL Database に接続するときは、Enterprise Library 6 – April 2013 の一部である Transient Fault Handling Application Block に、一時エラー状態を識別する検出戦略があります。詳細については、「方法:Azure SQL Database への信頼性の高い接続」を参照してください。

Azure SQL Database への ADO.NET 接続は似ていますが、内部設置型の接続を再試行戦略を実装して使用する、ReliableSqlConnectionします。再試行機能およびReliableSqlConnectionクラスの一部である、Transient Fault Handling Application Blockします。

Transient Fault Handling Application Block のインストールについては、「How to install Transient Fault Handling Application Block 6.0」を参照してください。

Transient Fault Handling Application Block 6.0 の使用

  1. Azure SQL Database の制限の指数バックオフ再試行戦略を定義します。指数バックオフ戦略は、サービスの負荷を適切にバックオフします。

    ExponentialBackoff exponentialBackoffStrategy = 
                    new ExponentialBackoff("exponentialBackoffStrategy",
                        retryCount,
                        TimeSpan.FromMilliseconds(minBackoffDelayMilliseconds), 
                        TimeSpan.FromMilliseconds(maxBackoffDelayMilliseconds),
                        TimeSpan.FromMilliseconds(deltaBackoffMilliseconds));
    
    
  2. 既定の戦略を指数バックオフに設定します。

    RetryManager manager = new RetryManager(new List<RetryStrategy>
    {
    exponentialBackoffStrategy 
    }, 
    " exponentialBackoffStrategy");
    
    
  3. 既定の再試行マネージャーを設定します。RetryManager は再試行機能を提供します。

    RetryManager.SetDefault(manager);
    
    
  4. 既定の SQL 接続再試行ポリシーと SQL コマンド再試行ポリシーを定義します。ポリシーは、信頼性の低いアクションおよび一時的なビジー状態のための再試行メカニズムを提供します。

    RetryPolicy retryConnectionPolicy = manager.GetDefaultSqlConnectionRetryPolicy();
    RetryPolicy retryCommandPolicy = manager.GetDefaultSqlCommandRetryPolicy();
    
    
  5. ReliableSqlConnection を使用して接続を再試行する関数を作成します。

    retryConnectionPolicy.ExecuteAction(() =>
                {
      using (ReliableSqlConnection connection = new   
      ReliableSqlConnection(builder.ConnectionString)) …
    
    
  6. ExecuteCommand() から呼び出すことのコマンドを再試行する関数を作成、ReliableSqlConnectionします。

    retryCommandPolicy.ExecuteAction(() =>
    {
    using (IDataReader reader = connection.ExecuteCommand<IDataReader>(command)) …
    
    

static void Main(string[] args)
        {
            //NOTE: Use appropriate exception handling in a production application.

            //Replace
            //  builder["Server"]: {servername} = Your Azure SQL Database server name
            //  builder["User ID"]: {username}@{servername} = Your Azure SQL Database user name and server name
            //  builder["Password"]: {password} = Your Azure SQL Database password

            System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder();
            builder["Server"] = "{servername}";
            builder["User ID"] = "{username}@{servername}";
            builder["Password"] = "{password}";

            builder["Database"] = "AdventureWorks2012";
            builder["Trusted_Connection"] = false;
            builder["Integrated Security"] = false;
            builder["Encrypt"] = true;

            //1. Define an Exponential Backoff retry strategy for Azure SQL Database throttling (ExponentialBackoff Class). An exponential back-off strategy will gracefully back off the load on the service.
            int retryCount = 4;
            int minBackoffDelayMilliseconds = 2000;
            int maxBackoffDelayMilliseconds = 8000;
            int deltaBackoffMilliseconds = 2000;

            ExponentialBackoff exponentialBackoffStrategy = 
                new ExponentialBackoff("exponentialBackoffStrategy",
                    retryCount,
                    TimeSpan.FromMilliseconds(minBackoffDelayMilliseconds), 
                    TimeSpan.FromMilliseconds(maxBackoffDelayMilliseconds),
                    TimeSpan.FromMilliseconds(deltaBackoffMilliseconds));

            //2. Set a default strategy to Exponential Backoff.
            RetryManager manager = new RetryManager(new List<RetryStrategy>
            {  
                exponentialBackoffStrategy 
            }, "exponentialBackoffStrategy");

            //3. Set a default Retry Manager. A RetryManager provides retry functionality, or if you are using declarative configuration, you can invoke the RetryPolicyFactory.CreateDefault
            RetryManager.SetDefault(manager);

            //4. Define a default SQL Connection retry policy and SQL Command retry policy. A policy provides a retry mechanism for unreliable actions and transient conditions.
            RetryPolicy retryConnectionPolicy = manager.GetDefaultSqlConnectionRetryPolicy();
            RetryPolicy retryCommandPolicy = manager.GetDefaultSqlCommandRetryPolicy();

            //5. Create a function that will retry the connection using a ReliableSqlConnection.
            retryConnectionPolicy.ExecuteAction(() =>
            {
                using (ReliableSqlConnection connection = new ReliableSqlConnection(builder.ConnectionString))
                {
                    connection.Open();

                    IDbCommand command = connection.CreateCommand();
                    command.CommandText = "SELECT Name FROM Production.Product";

                    //6. Create a function that will retry the command calling ExecuteCommand() from the ReliableSqlConnection
                    retryCommandPolicy.ExecuteAction(() =>
                    {
                        using (IDataReader reader = connection.ExecuteCommand<IDataReader>(command))
                        {
                            while (reader.Read())
                            {
                                string name = reader.GetString(0);

                                Console.WriteLine(name);
                            }
                        }
                    });                  
                }
            });

            Console.ReadLine();
        }

Azure SQL データベース アプリケーションで ADO.NET のデータベースに接続するときには、以下の点について注意してください。

  • インジェクション攻撃を回避するために、SqlConnectionStringBuilder クラスを使用します。これは、接続文字列の作成を容易にするための、.NET Framework のクラスです。詳細については、「接続文字列ビルダー (ADO.NET)」を参照してください。

  • 接続文字列には、潜在的な脆弱性が存在します。接続文字列の保護の詳細については、「接続情報の保護」を参照してください。

  • インターネット経由で Azure SQL データベースに接続する場合は特に、接続を暗号化することで中間者攻撃が不可能になります。Encrypt 接続プロパティを True に設定します (Encrypt = True)。TrustServerCertificate 接続プロパティを False に設定します (TrustServerCertificate = False)。

  • Azure SQL データベース でデータベースに接続する場合の一般的な考慮事項については、「Azure SQL データベースに接続するためのガイドライン」および「技術記事 - アイドル状態の接続の回復 (英語)」を参照してください。

  • Azure SQL データベースへの接続を開く場合は、接続タイムアウトを 30 秒に設定します。

関連項目

表示:
© 2014 Microsoft