Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Microsoft. Data.SqlClient connection pooling menggunakan kembali koneksi fisik yang telah diautentikasi.
SqlConnection.Open atau OpenAsync memeriksa kumpulan koneksi untuk mencari koneksi yang dapat digunakan.
Close, Dispose, atau DisposeAsync mereset dan mengembalikannya. Pendekatan ini menghindari koneksi jaringan, autentikasi, dan pengaturan sesi untuk setiap operasi.
Pooling diaktifkan secara default. Gunakan pola aplikasi ini:
await using var connection = new SqlConnection(connectionString);
await connection.OpenAsync(cancellationToken);
using var command = new SqlCommand(sql, connection);
await command.ExecuteNonQueryAsync(cancellationToken);
Buka larut, buang lebih awal, dan biarkan kolam yang mengatur koneksi fisik. Jangan biarkan satu pun SqlConnection terbuka secara global.
Pahami kunci kumpulan
Koneksi hanya dapat digunakan kembali dari pool yang sesuai. Kunci pool mencakup lebih dari sekadar server tujuan.
| Input | Perilaku Pool |
|---|---|
| Rangkaian koneksi | Teks harus persis sama. Perbedaan urutan kata kunci menciptakan pool terpisah, bahkan ketika pengaturan efektifnya setara. |
| Autentikasi terintegrasi Windows | Identitas Windows adalah bagian dari kunci. String yang sama yang digunakan di bawah identitas berbeda menciptakan pool yang berbeda. |
SqlCredential |
Instansi objek adalah bagian dari kunci. Instansi terpisah membuat pool terpisah meskipun berisi nama pengguna dan kata sandi yang sama. |
SqlConnection.AccessToken |
Nilai token akses adalah bagian dari kunci. Mengganti string token dapat membuat pool baru dan membiarkan koneksi tetap terautentikasi dengan token lama di pool yang sudah ada. |
SqlConnection.AccessTokenCallback |
Fungsi callback merupakan bagian dari kunci. Gunakan kembali instance callback yang sama untuk koneksi yang seharusnya berbagi pool. Nilai token yang dikembalikan bukanlah kunci pool. |
| Penyedia konteks SSPI khusus | Instansi penyedia berpartisipasi dalam konfigurasi koneksi. Gunakan kembali satu instance penyedia untuk koneksi yang seharusnya digabungkan. |
| Transaksi lingkungan | Koneksi yang terdaftar menggunakan subdivisi khusus transaksi di dalam pool yang sesuai. |
Basis data, mode autentikasi, opsi enkripsi, nama aplikasi, opsi pooling, dan setiap nilai string koneksi lainnya berkontribusi melalui string yang sama persis.
Buat satu string koneksi standar dan gunakan ulang. Hindari nilai per permintaan dalam Application Name, Workstation ID, atau kata kunci lainnya.
Pilih API token yang dapat digabungkan
Untuk token akses Microsoft Entra ID, gunakan mode autentikasi yang disediakan oleh Microsoft. Data.SqlClient atau stabil.AccessTokenCallback
AccessTokenCallback diperkenalkan di Microsoft.Data.SqlClient 5.2. Driver memanggil fungsi ini saat memerlukan token dan dapat meminta token yang diperbarui untuk pool yang digunakan ulang. Pertahankan callback deterministik untuk parameter otentikasi yang disediakan driver, dan gunakan kembali instance delegate yang sama.
Saat kode menetapkan AccessToken secara langsung:
- String token menjadi bagian dari kunci pool.
- Aplikasi ini memiliki kedaluwarsa dan pembaruan token.
- Koneksi fisik yang digabungkan dapat bertahan lebih lama daripada token yang digunakan untuk membuatnya.
- Panggil ClearPool setelah mengganti token yang kedaluwarsa jika pool tersebut tidak dapat digunakan dengan aman lagi.
Jangan buat callback lambda atau objek kredensial baru untuk setiap permintaan. Perbedaan identitas objek dapat menyebabkan pool-pool terfragmentasi.
Microsoft.Data.SqlClient 7.0 menambahkan SspiContextProvider untuk negosiasi Kerberos atau NTLM khusus. Anggap penyedia sebagai konfigurasi koneksi dalam cakupan aplikasi, bukan status per permintaan.
Tentukan ukuran setiap kolam
Opsi string koneksi ini mengatur satu kumpulan:
| Keyword | Default | Efek |
|---|---|---|
Pooling |
true |
Mengaktifkan atau menonaktifkan pooling. |
Min Pool Size |
0 |
Mengatur jumlah minimum koneksi fisik yang dipertahankan pool setelah dibuat. |
Max Pool Size |
100 |
Mengatur jumlah maksimum koneksi fisik dalam pool. |
Connect Timeout |
15 detik | Mengatur berapa lama Open menunggu ketika tidak ada koneksi yang dapat digunakan. |
Load Balance Timeout |
0 detik |
Membuang koneksi saat kembali ke pool jika usianya melebihi nilai yang dikonfigurasi.
Connection Lifetime adalah alias. |
Kolam menciptakan koneksi seiring meningkatnya permintaan hingga mencapai Max Pool Size. Ketika semua koneksi sedang digunakan, permintaan pembukaan koneksi berikutnya akan menunggu hingga ada koneksi yang tersedia kembali. Jika waktu tunggu melebihi Connect Timeout, pembukaan gagal.
Jangan menaikkan Max Pool Size sebelum memeriksa:
- Setiap koneksi dan pembaca ditempatkan pada setiap jalur.
- Perintah dan transaksi selesai dengan cepat.
- Beban kerja kueri tidak terhambat atau mengalami saturasi.
- Batas koneksi database dapat menangani
Max Pool Sizeyang dikalikan dengan jumlah pool di setiap instance aplikasi.
Min Pool Size yang bernilai positif menjaga koneksi tetap terbuka saat tidak aktif. Gunakan hanya jika pengukuran membenarkan koneksi hangat. Biasanya ini bekerja melawan desain cloud yang bisa meledak-turun skala ke nol, tanpa server, dan cloud yang dapat meledak.
Dengan default Load Balance Timeout=0, pembersihan berkala biasanya menghapus koneksi yang tidak terpakai di atas Min Pool Size setelah sekitar empat hingga delapan menit, atau pool menghapusnya ketika mendeteksi koneksi server terputus. Perlakukan interval itu sebagai perilaku implementasi, bukan jaminan idle per koneksi. Pool tidak mengirim kueri validasi sebelum setiap checkout karena perjalanan pulang-pergi itu menghilangkan banyak manfaat pooling.
Menangani periode pemblokiran autentikasi
Setelah waktu autentikasi habis atau terjadi kegagalan autentikasi lainnya, kumpulan dapat memasuki periode pemblokiran. Selama periode tersebut, upaya terbuka yang cocok akan melempar kembali pengecualian asli tanpa melakukan upaya autentikasi lain.
Periode pemblokiran pertama adalah selama lima detik. Setelah terjadi kegagalan lagi, periodenya menjadi dua kali lipat hingga satu menit.
Pool Blocking Period Mengontrol perilaku ini:
| Nilai | Behavior |
|---|---|
Auto |
Mengaktifkan pemblokiran untuk endpoint SQL Server biasa dan menonaktifkannya untuk sufiks endpoint Azure SQL yang dikenali. Nama DNS vanity mungkin tidak menerima perilaku Azure. |
AlwaysBlock |
Mengaktifkan periode pemblokiran untuk setiap endpoint. |
NeverBlock |
Menonaktifkan periode blokir. |
Pertahankan Auto kecuali desain percobaan ulang terukur pada aplikasi mengharuskan pilihan yang berbeda. Menonaktifkan periode pemblokiran dapat mengubah masalah kredensial, firewall, atau gangguan menjadi badai autentikasi.
Periode pemblokiran terpisah dari logika retry yang dapat dikonfigurasi. Penyedia percobaan ulang yang membuka pool yang sama selama periode pemblokiran akan menerima pengecualian yang di-cache.
Kelola masa pakai koneksi dan proses pembersihan
Pool secara otomatis menghapus pool yang terdampak ketika mengenali kesalahan fatal, seperti failover. Pool menutup koneksi yang sedang diam dan membuang koneksi yang sudah dicek saat mereka kembali.
Gunakan API pembersihan untuk batas konfigurasi atau kredensial yang diketahui:
-
ClearPool menghapus pool yang terkait dengan
SqlConnectionkonfigurasi. - ClearAllPoolsmenghapus semua pool Microsoft. Data.SqlClient di domain proses atau aplikasi.
Pool menutup koneksi yang tidak aktif dalam pool yang telah dikosongkan. Pool menandai koneksi yang sedang digunakan agar koneksi tersebut dibuang saat dikembalikan ke pool.
Mengosongkan pool menyebabkan pembukaan selanjutnya mengharuskan login fisik. Jangan gunakan sebagai pemeliharaan berkala, penanganan kesalahan umum, atau pengganti untuk membuang koneksi.
Load Balance Timeout memberikan pergantian bertahap berdasarkan usia. Gunakan ini ketika deployment atau layanan terklaster memerlukan koneksi fisik lama untuk terputus secara bertahap. Pastikan nilai yang dipilih tidak menyebabkan koneksi paksa yang berlebihan.
Memahami transaksi
Dengan Enlist=true, sebagai default, koneksi yang dibuka di dalam System.Transactions.Transaction.Current secara otomatis mendaftar dalam transaksi tersebut.
Ketika koneksi tamtama ditutup, pool menempatkannya di subdivisi khusus transaksi. Yang dibuka kemudian di bawah transaksi yang sama dapat digunakan kembali. Koneksi fisik tidak kembali ke pool umum sampai transaksi selesai.
Karena itu, transaksi ambient yang berlangsung lama atau terbengkalai dapat:
- Jauhkan koneksi fisik dari kumpulan umum.
- Gunakan kapasitas kumpulan koneksi setelah koneksi logis ditutup.
- Pertahankan kunci server dan status transaksi tetap aktif.
Pastikan transaksi tetap dalam batas yang jelas, selesaikan transaksi tersebut secara eksplisit, dan pantau koneksi stasis. Atur Enlist=false hanya ketika koneksi harus tetap berada di luar transaksi ambient.
Cegah fragmentasi kumpulan
Fragmentasi kolam menciptakan banyak kolam kecil daripada beberapa kolam yang dapat digunakan ulang. Penyebab umumnya meliputi:
- Perbedaan urutan kata kunci pada string koneksi atau perbedaan alias.
- Satu string koneksi per pelanggan, pengguna, permintaan, atau basis data.
- Autentikasi terintegrasi di bawah banyak identitas Windows.
- Callback token akses baru
SqlCredential, atau instance penyedia SSPI per permintaan. - Token akses langsung yang berubah setiap kali penyegaran.
- Nama aplikasi atau ID workstation dengan kardinalitas tinggi.
Normalisasi string koneksi dengan SqlConnectionStringBuilder dan sentralisasi pembuatan koneksi.
Jika aplikasi sengaja terhubung ke banyak database atau identitas, sertakan jumlah pool yang dihasilkan dalam perencanaan kapasitas. Jangan jalankan USE dengan nama database yang tidak terpercaya untuk merusak pool. Isolasi basis data, izin, status sesi, dan perilaku reset pool harus tetap eksplisit.
Memperhitungkan peran aplikasi dan status sesi
Pool ini mengatur ulang status sesi SQL Server yang dapat digunakan ulang sebelum menetapkan koneksi fisik ke koneksi logis lain. Kode aplikasi tetap harus menetapkan status sesi yang diperlukan dalam unit kerjanya.
Peran aplikasi SQL Server yang diaktifkan dengan sp_setapprole tidak dapat direset dengan aman untuk pooling biasa. Utamakan pengguna basis data, pengguna mandiri, peran, keamanan tingkat baris, atau rancangan otorisasi lainnya. Jika peran aplikasi tidak dapat dihindari, gunakan pola pembalikan berbasis cookie yang terdokumentasi atau nonaktifkan pooling untuk jalur terisolasi tersebut setelah pengujian.
Buang pembaca, selesaikan atau tarik kembali transaksi, dan jangan biarkan perintah berjalan saat koneksi ditutup. Jangan bergantung pada tabel sementara atau status sesi lain yang bertahan di koneksi logis.
Gunakan pola pooling yang dihosting di cloud
Untuk Azure App Service, Azure Functions, containers, Kubernetes, dan host lain yang diskalakan secara horizontal:
- Hitung kemungkinan koneksi database di semua instance, proses, kunci pool, dan replika.
- Gunakan identitas terkelola atau callback token akses yang stabil alih-alih mengganti string token secara berkala dalam objek koneksi.
- Simpan
Min Pool Size=0kecuali persyaratan cold-start yang terukur membenarkan sesi yang dipertahankan. - Perkirakan instance baru akan dimulai dengan pool kosong.
- Jaga string koneksi tetap identik di seluruh instance yang melayani beban kerja yang sama.
- Batasi percobaan koneksi dan percobaan ulang untuk menghindari lonjakan login yang tersinkronisasi selama failover atau scale-out.
- Atur
MultiSubnetFailover=trueuntuk Azure SQL dan endpoint TCP multi-alamat lainnya yang didukung.
Connection pool bersifat lokal pada proses aplikasi. Mereka tidak dibagikan antar instance aplikasi, kontainer, atau host.
Mendiagnosis perilaku pool
Gunakan penghitung diagnostik SqlClient untuk mengamati:
- Koneksi dan pemutusan koneksi fisik, yang merepresentasikan koneksi server fisik.
- Koneksi lunak dan pemutusan koneksi, yang merepresentasikan pengambilan dan pengembalian dari pool.
- Koneksi gabungan yang aktif dan tersedia.
- Kelompok dan kolam renang aktif.
- Sambungan Stasis.
- Koneksi yang diambil kembali ketika kode aplikasi tidak melepaskan koneksi logis.
Korelasikan penghitung klien dengan sesi SQL Server, menunggu, pemblokiran, dan batas sumber daya. Batas waktu pool dapat berarti adanya kebocoran koneksi, kueri yang lambat, transaksi yang diblokir, terlalu banyak konkurensi simultan, fragmentasi pool, atau batas kapasitas basis data.
Gunakan pelacakan sumber event untuk jejak pooler yang ditargetkan. Pelacakan sangat mendetail. Aktifkan untuk jendela diagnostik terbatas dan lindungi metadata koneksi yang tertangkap.
Daftar periksa produksi
- Biarkan pooling tetap diaktifkan.
- Gunakan kembali satu string koneksi kanonis untuk setiap beban kerja dan basis data.
- Hapus koneksi, perintah, pembaca, dan transaksi di setiap jalur.
- Gunakan kembali instansi kredensial, callback token, dan penyedia SSPI.
- Atur batas waktu koneksi dan perintah yang terbatas.
- Sesuaikan total anggaran koneksi di setiap instance aplikasi.
- Pantau koneksi hard, jumlah pool, koneksi yang tersedia, stasis, dan timeout.
- Bersihkan pool hanya untuk kredensial, token, atau batas konfigurasi yang tidak dapat dideteksi oleh penyedia, atau ketika diagnostik mengonfirmasi bahwa koneksi yang sudah rusak masih ada.
- Uji beban melakukan skala keluar, failover, dan perilaku penyegaran kredensial sebelum produksi.