L'accesso ai dati nell'era del cloud computing con Windows Azure

di William Franchini, in LINQ,

Generalmente nelle applicazioni tradizionali l'application e il data tier risiedono nello stesso data center. L'introduzione di Azure e del cloud computing in generale ha creato nuovi scenari dove questa architettura può essere variata in molti modi. SQL Azure è il servizio di database relazionali della piattaforma Azure. In questo articolo vedremo come le nostre applicazioni possono accedere ai dati tramite SQL Azure.

Scenari

Ci sono due scenari principali. Nel primo il codice applicativo rimane on-premise mentre i database sono in SQL Azure. In questo caso le applicazioni useranno delle librerie client per eseguire le operazioni di accesso ai dati. Nel secondo scenario anche l'applicazione è in "the cloud" e viene ospitata in Windows Azure e utilizza le stesse librerie client del primo caso. Sebbene l'approccio alla programmazione SQL sia molto simile a quello che si userebbe quando i database SQL Server sono locali, nel programmare SQL Azure vanno tenute in conto sia alcune limitazioni in T-SQL (che vedremo più avanti) sia il fatto che la latenza di rete è certamente maggiore specialmente nel primo scenario (nel caso in cui l'applicazione sia su Windows Azure il problema è notevolmente inferiore).

Hello World

Prima di andare avanti con l'architettura di SQL Azure, e con delle considerazioni più sistematiche, è tempo per un "Hello, World" riveduto e corretto che ci dia modo di mettere subito le mani sul codice. Creiamo un database su SQL Azure e scriviamo un'applicazione on-premise che accede a dati su questo database: niente di eclatante, ma d'altra parte è un "Hello, World" no? Ci sono due modi per creare un database partendo da zero: usare il portale o tramite un'istruzione CREATE DATABASE. Dal portale sql.azure.com, dopo aver acceduto con il proprio account, basta utilizzare il pannello "Databases" per creare un nuovo database. Per default il firewall di Azure blocca l'accesso ai client. Per garantire l'accesso è necessario inserire una regola all'interno del tab "Firewall".

Con quattro click abbiamo creato un nuovo database, WilloPlayground, e abbiamo garantito l'accesso al client (il bottone "Test Connectivity" consente di controllare se le impostazioni del firewall sono corrette). In questo esempio siamo nel primo scenario descritto precedentemente; ora proveremo a connetterci con un client on-premise usando le librerie client di ADO.NET. Il codice che segue si connette al database su SQL Azure, crea un tabella sul database WilloPlayground ed esegue alcune istruzioni di inserimento e SELECT, mostrando i dati in una console. Il programma usa il tipo SqlConnectionStringBuilder per creare la stringa di connessione al database remoto e, come è facile constatare, non è per nulla differente rispetto ad un programma che accede a un database locale.

class Program
{
  // Provide the following information
  private static string userName = "<qui va nome utente>";
  private static string password = "<qui va password>";
  private static string dataSource = "<nome server>.database.windows.net";
  private static string sampleDatabaseName = "<nome database>";

  static void Main(string[] args)
  {
    // Usa un oggetto SqlConnectionStringBuilder per costruire 
    // la stringa di connessione al database
    SqlConnectionStringBuilder connStringBuilder;
    connStringBuilder = new SqlConnectionStringBuilder();
    connStringBuilder.DataSource = dataSource;
    connStringBuilder.InitialCatalog = sampleDatabaseName;
    connStringBuilder.Encrypt = true;
    connStringBuilder.TrustServerCertificate = false;
    connStringBuilder.UserID = userName;
    connStringBuilder.Password = password;

    //fa un po' di operazioni sulla tabella Greetings 
    using (SqlConnection conn = new SqlConnection(connStringBuilder.ToString()))
    {
      using (SqlCommand command = conn.CreateCommand())
      {
        conn.Open();

        //Crea un tabella
        command.CommandText = "CREATE TABLE Greetings " + 
          "(Col1 int primary key, Col2 varchar(20))";
        command.ExecuteNonQuery();

        // Inserisce dei record
        command.CommandText = "INSERT INTO Greetings (col1, col2) " + 
          "values (1, 'Hello'), (2, ','), (3, 'World')";
        int rowsAdded = command.ExecuteNonQuery();

        //Estrae tutti i record dalla tabella greetings
        command.CommandText = "SELECT * FROM Greetings";

        using (SqlDataReader reader = command.ExecuteReader())
        {
          while (reader.Read())
          {
            Console.WriteLine("{0}: {1}",
              reader["Col1"].ToString().Trim(),
            reader["Col2"].ToString().Trim());
          }
        }
        conn.Close();
      }
    }
    Console.WriteLine("Press enter to continue...");
    Console.ReadLine();
  }
}

L'utilizzo delle librerie client e delle istruzioni T-SQL sui database di SQL Azure presentano alcune limitazioni rispetto a quanto possibile su SQL Server 2008 R2. Iniziamo da T-SQL. Il T-SQL di Azure è un sottoinsieme del T-SQL di SQL Server 2008. La lista completa delle istruzioni non supportate è accessibile su MSDN ma sostanzialmente non sono supportate le seguenti funzionalità:

  • CLR
  • Service Broker
  • Spatial data
  • UDT
  • Query e transazioni distribuite
  • Mirroring
  • Gestione dei filegroup
  • Tabelle temporanee globali
  • Operazioni di configurazione di SQL Server

Il resto delle operazioni sono supportate nella forma utilizzata in SQL Server 2008 o con una sintassi modificata.

3 pagine in totale: 1 2 3
Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti