Bagikan melalui


Menggunakan perutean tergantung data untuk merutekan kueri ke database yang sesuai

Berlaku untuk: Azure SQL Database

Perutean tergantung data adalah kemampuan menggunakan data dalam kueri untuk merutekan permintaan ke database yang sesuai. Perutean tergantung data adalah pola mendasar saat bekerja dengan database yang di-shard. Konteks permintaan juga dapat digunakan untuk merutekan permintaan, terutama jika kunci sharding bukan bagian dari kueri. Setiap kueri atau transaksi tertentu dalam aplikasi menggunakan perutean tergantung data dibatasi untuk mengakses satu database per permintaan. Untuk alat elastis Azure SQL Database, perutean ini dicapai dengan kelas ShardMapManager (Java, .NET).

Aplikasi ini tidak perlu melacak berbagai string koneksi atau lokasi DB yang terkait dengan potongan data yang berbeda di lingkungan yang di-shard. Sebaliknya, Shard Map Manager membuka koneksi ke database yang benar saat diperlukan, berdasarkan data di peta shard dan nilai kunci sharding yang merupakan target permintaan aplikasi. Kuncinya biasanya adalah customer_id, tenant_id, date_key, atau beberapa pengidentifikasi spesifik lainnya yang merupakan parameter mendasar dari permintaan database.

Untuk informasi selengkapnya, lihat Meluaskan Skala SQL Server dengan Perutean Tergantung Data.

Mengunduh pustaka klien

Untuk mengunduh:

Menggunakan ShardMapManager dalam aplikasi perutean tergantung data

Aplikasi harus memulai ShardMapManager selama inisialisasi, menggunakan panggilan pabrik GetSQLShardMapManager (Java, .NET). Dalam contoh ini, ShardMapManager dan ShardMap spesifik yang ada di dalamnya diinisialisasi. Contoh ini menunjukkan metode GetSqlShardMapManager dan GetRangeShardMap (Java, .NET).

ShardMapManager smm = ShardMapManagerFactory.getSqlShardMapManager(connectionString, ShardMapManagerLoadPolicy.Lazy);
RangeShardMap<int> rangeShardMap = smm.getRangeShardMap(Configuration.getRangeShardMapName(), ShardKeyType.Int32);
ShardMapManager smm = ShardMapManagerFactory.GetSqlShardMapManager(smmConnectionString, ShardMapManagerLoadPolicy.Lazy);
RangeShardMap<int> customerShardMap = smm.GetRangeShardMap<int>("customerMap"); 

Menggunakan info masuk hak istimewa serendah mungkin untuk mendapatkan peta shard

Jika aplikasi tidak memanipulasi peta shard itu sendiri, info masuk yang digunakan dalam metode pabrik harus memiliki izin baca-saja pada database Global Shard Map. Info masuk ini biasanya berbeda dari info masuk yang digunakan untuk membuka koneksi ke pengelola peta shard. Lihat juga Info masuk yang digunakan untuk mengakses pustaka klien Elastic Database.

Panggil metode OpenConnectionForKey

Metode ShardMap.OpenConnectionForKey (Java, .NET) mengembalikan koneksi yang siap untuk mengeluarkan perintah ke database yang sesuai berdasarkan nilai parameter kunci. Informasi Shard di-cache dalam aplikasi oleh ShardMapManager, sehingga permintaan tersebut biasanya tidak melibatkan pencarian database terhadap database Global Shard Map.

// Syntax:
public Connection openConnectionForKey(Object key, String connectionString, ConnectionOptions options)
// Syntax:
public SqlConnection OpenConnectionForKey<TKey>(TKey key, string connectionString, ConnectionOptions options)
  • Parameter kunci digunakan sebagai kunci pencarian ke dalam peta shard untuk menentukan database yang sesuai untuk permintaan.
  • connectionString digunakan untuk hanya meneruskan info masuk pengguna untuk koneksi yang diinginkan. Tidak ada nama database atau nama server yang disertakan dalam connectionString ini karena metode menentukan database dan server menggunakan ShardMap.
  • connectionOptions (Java, .NET) harus diatur ke ConnectionOptions.Validate jika lingkungan di mana peta shard dapat berubah dan baris dapat berpindah ke database lain sebagai akibat dari operasi pemisahan atau penggabungan. Validasi ini melibatkan kueri singkat ke peta shard lokal pada database target (bukan ke peta shard global) sebelum koneksi dikirim ke aplikasi.

Jika validasi terhadap peta shard lokal gagal (menunjukkan bahwa cache salah), Shard Map Manager meminta peta shard global untuk mendapatkan nilai baru yang benar untuk pencarian, memperbarui cache, dan mendapatkan dan mengembalikan koneksi database yang sesuai.

Gunakan ConnectionOptions.None hanya ketika perubahan pemetaan shard tidak diharapkan saat aplikasi online. Dalam hal ini, nilai yang ditembolokan dapat diasumsikan selalu benar, dan panggilan validasi bolak-balik ekstra ke database target dapat dilompati dengan aman. Itu mengurangi lalu lintas database. connectionOptions juga dapat diatur melalui nilai dalam file konfigurasi untuk menunjukkan apakah perubahan sharding diharapkan atau tidak selama periode waktu tertentu.

Contoh ini menggunakan nilai kunci bilangan bulat CustomerID, menggunakan objek ShardMap bernama customerShardMap.

int customerId = 12345;
int productId = 4321;
// Looks up the key in the shard map and opens a connection to the shard
try (Connection conn = shardMap.openConnectionForKey(customerId, Configuration.getCredentialsConnectionString())) {
    // Create a simple command that will insert or update the customer information
    PreparedStatement ps = conn.prepareStatement("UPDATE Sales.Customer SET PersonID = ? WHERE CustomerID = ?");

    ps.setInt(1, productId);
    ps.setInt(2, customerId);
    ps.executeUpdate();
} catch (SQLException e) {
    e.printStackTrace();
}
int customerId = 12345;
int newPersonId = 4321;

// Connect to the shard for that customer ID. No need to call a SqlConnection
// constructor followed by the Open method.
using (SqlConnection conn = customerShardMap.OpenConnectionForKey(customerId, Configuration.GetCredentialsConnectionString(), ConnectionOptions.Validate))
{
    // Execute a simple command.
    SqlCommand cmd = conn.CreateCommand();
    cmd.CommandText = @"UPDATE Sales.Customer
                        SET PersonID = @newPersonID WHERE CustomerID = @customerID";

    cmd.Parameters.AddWithValue("@customerID", customerId);cmd.Parameters.AddWithValue("@newPersonID", newPersonId);
    cmd.ExecuteNonQuery();
}  

Metode OpenConnectionForKey mengembalikan koneksi baru yang sudah terbuka ke database yang benar. Koneksi yang digunakan dengan cara ini masih mengambil keuntungan penuh dari kumpulan koneksi.

Metode OpenConnectionForKeyAsync method (Java, .NET) juga tersedia jika aplikasi Anda menggunakan pemrograman asinkron.

Mengintegrasikan dengan penanganan kesalahan sementara

Praktik terbaik dalam mengembangkan aplikasi akses data di cloud adalah memastikan bahwa kesalahan sementara dideteksi oleh aplikasi, dan bahwa operasi dicoba beberapa kali sebelum melemparkan kesalahan. Penanganan kesalahan sementara untuk aplikasi cloud dibahas di Transient Fault Handling (Java, .NET).

Penanganan kesalahan sementara dapat berfungsi bersamaan dengan pola Perutean Tergantung Data. Persyaratan utamanya adalah mencoba kembali seluruh permintaan akses data termasuk blok penggunaan yang memperoleh koneksi perutean tergantung data. Contoh sebelumnya dapat ditulis ulang sebagai berikut.

Contoh - perutean tergantung data dengan penanganan kesalahan sementara

int customerId = 12345;
int productId = 4321;
try {
    SqlDatabaseUtils.getSqlRetryPolicy().executeAction(() -> {
        // Looks up the key in the shard map and opens a connection to the shard
        try (Connection conn = shardMap.openConnectionForKey(customerId, Configuration.getCredentialsConnectionString())) {
            // Create a simple command that will insert or update the customer information
            PreparedStatement ps = conn.prepareStatement("UPDATE Sales.Customer SET PersonID = ? WHERE CustomerID = ?");

            ps.setInt(1, productId);
            ps.setInt(2, customerId);
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    });
} catch (Exception e) {
    throw new StoreException(e.getMessage(), e);
}
int customerId = 12345;
int newPersonId = 4321;

Configuration.SqlRetryPolicy.ExecuteAction(() -> {

    // Connect to the shard for a customer ID.
    using (SqlConnection conn = customerShardMap.OpenConnectionForKey(customerId, Configuration.GetCredentialsConnectionString(), ConnectionOptions.Validate))
    {
        // Execute a simple command
        SqlCommand cmd = conn.CreateCommand();

        cmd.CommandText = @"UPDATE Sales.Customer
                            SET PersonID = @newPersonID
                            WHERE CustomerID = @customerID";

        cmd.Parameters.AddWithValue("@customerID", customerId);
        cmd.Parameters.AddWithValue("@newPersonID", newPersonId);
        cmd.ExecuteNonQuery();

        Console.WriteLine("Update completed");
    }
});

Paket yang diperlukan untuk menerapkan penanganan kesalahan sementara diunduh secara otomatis saat Anda membuild aplikasi sampel database elastis.

Konsistensi transaksional

Properti transaksional dijamin untuk semua operasi lokal hingga shard. Misalnya, transaksi yang diajukan melalui eksekusi perutean tergantung data dalam cakupan shard target untuk koneksi. Saat ini, tidak ada kemampuan yang disediakan untuk memasukkan beberapa koneksi ke dalam transaksi, maka dari itu tidak ada jaminan transaksional untuk operasi yang dilakukan lintas shard.

Langkah berikutnya

Untuk mencopot shard, atau untuk memasang shard, lihat Menggunakan kelas RecoveryManager untuk memperbaiki masalah peta shard.

Belum menggunakan alat database elastis? Lihat Panduan Memulai kami. Jika memiliki pertanyaan, hubungi kami di halaman pertanyaan Tanya Jawab Microsoft untuk SQL Database dan untuk permintaan fitur, tambahkan ide-ide baru atau ambil suara terbanyak untuk ide yang sudah ada di forum umpan balik SQL Database.