Max Connection Pool maksimal 100


27

Saya menjalankan SQL Server 2008 R2 SP1, pada kotak Windows Server 2008. Saya memiliki skrip .NET yang berjalan dari Visual Studio 2010 yang melakukan hal berikut:

  • Mencapai ke dalam basis data
  • Melakukan perubahan
  • Iterasi

Jumlah total yang akan diulangnya adalah 150, namun berhenti pada 100 koneksi dan saya tidak tahu mengapa. Saya dapat menyesuaikan skrip untuk hanya menggunakan utas tunggal, tetapi saya lebih suka untuk mengetahui di mana saya kehilangan pengaturan koneksi maks karena akan lebih berguna untuk mengetahui referensi di masa mendatang.

Di sinilah saya telah memeriksa sejauh ini:

  • String Koneksi SQL di Visual Studio 2010 (diatur ke 1000)
  • Properti koneksi instance SSMS Database (diatur ke 0 koneksi pengguna [infinity])
  • Menelusuri beberapa informasi di Server 2008, sepertinya ia dapat menangani lebih dari 100 koneksi
  • Melangkahi kode saya di samping SP_WHO2yang memberikan lebih banyak informasi tentang koneksi logis, melihat bahwa # koneksi dimulai pada 52 dan kesalahan skrip dengan kesalahan "Max Pooled Connections tercapai" kesalahan di 152 koneksi logis.
  • Mengubah string koneksi untuk digunakan Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000

Saya tidak yakin di mana lagi untuk memeriksa, saya tahu saya memiliki banyak bagian yang bergerak di sini tapi saya merasa saya hanya melewatkan pengaturan max pool di suatu tempat.


1
Bisakah Anda memposting string koneksi Anda? Tolong lihat jawaban saya. Itu seharusnya menjadi solusi Anda (nilai ini akan ditentukan dalam string koneksi. System.Data.SqlClientDefault ke 100, itulah sebabnya Anda melihat kelelahan dari kumpulan koneksi).
Thomas Stringer

Jawaban:


24

SQL Server memungkinkan maksimum 32.767 koneksi secara default. Itu bisa diubah menggunakan sp_configure. Untuk melihat konfigurasi Anda saat ini untuk pengaturan ini, gunakan kueri berikut:

select * from sys.configurations
where name ='user connections'

Secara default, Anda akan melihat maksimum 32767, value_in_usesama dengan 0 (gunakan pengaturan default). Jika ini telah diubah, Anda dapat mengkonfigurasi ulang SQL Server untuk menggunakan nilai-nilai lain seperti yang dijelaskan dalam tautan.

Anda juga harus meninjau berapa banyak koneksi yang sebenarnya dibuat, karena mungkin ada lebih banyak aktivitas di luar aplikasi Anda (atau aplikasi Anda membuat lebih banyak koneksi daripada yang Anda pikirkan). Anda akan ingin melihat Statistik Umum -> Koneksi Logikal di perfmon atau kueri nilai di sys.dm_os_performance_counters(cntr_value akan menampilkan nilai saat ini dalam nilai waktu):

select * from sys.dm_os_performance_counters
where counter_name ='User Connections'

Yap, saya sudah memeriksa koneksi pengguna (ini adalah hal pertama yang saya kunjungi, dan merupakan yang termudah untuk ditemukan baik di UI maupun dalam dokumentasi Microsoft. Saya juga menelusuri kode saya dan mengawasi jumlah koneksi logis melalui SSMS oleh menggunakan SP_WHO2, yang memberikan jumlah informasi yang layak tentang koneksi logis. Pemalasan, server saya memiliki koneksi 51. Ketika skrip gagal, ia membangun 100 lebih banyak koneksi. Itulah cara saya sampai ke tempat saya sekarang
Sean Long

Saya sedikit memperjelas pertanyaan saya dengan langkah-langkah yang telah saya ambil. Mungkin tidak ada pengaturan dalam SQL sama sekali, itulah sebabnya saya mulai melihat pengaturan Windows dan Visual Studio.
Sean Long

1
Jika Anda sudah memeriksa semua itu dan masih gagal di 100 koneksi, jawabannya ada di luar pengaturan basis data. FYI, 51 koneksi tersebut adalah semua proses sistem (+1 untuk Anda sendiri).
Mike Fal

Hanya untuk memberikan penutupan, komentar terakhir itu ternyata benar. Saya melihat lebih dekat mengapa 100 koneksi itu dibuat dan menemukan kebocoran dalam kode. Setelah diperbaiki itu berfungsi dengan baik. Informasi di atas semuanya masih sangat berguna, dan saya harap orang lain akan merasakan manfaatnya juga.
Sean Long

25

Di string koneksi Anda, tentukan max pool size=<your desired max pool size>. Jadi dengan kata lain, jika Anda ingin mengubah ukuran max pool ke nilai 500, string koneksi Anda bisa menyerupai ini:

"data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500"

Jelas saya mengasumsikan begitu banyak dengan parameter Anda yang lain, tetapi ini akan memberi Anda ide yang baik untuk melanjutkan. Penggabungan koneksi adalah penegakan penyedia sisi klien. Klienlah yang perlu menentukan pengaturan ukuran kumpulan maks ini, melalui string koneksi.

Juga, pastikan Anda menutup atau membuang koneksi Anda dengan benar, jika tidak, Anda akan mengikat koneksi. Sesuatu seperti ini (C #):

string connectionString = "data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500";

using (SqlConnection dbConn = new SqlConnection(connectionString))
{
    using (SqlCommand sqlCmd = new SqlCommand())
    {
        sqlCmd.Connection = dbConn;
        sqlCmd.CommandText = "select 1;";

        // ... so on and so forth
    }
}

The usingblok (dalam C #) panggilan IDisposable.Dispose()setelah selesai. Anda juga bisa menerapkan SqlConnection.Dispose()atau SqlConnection.Close()di finallyblok try/catch/finallyblok.

Referensi: Dokumentasi MSDN pada properti SqlConnection.ConnectionString


Ini adalah string koneksi, memperbarui pertanyaan saya juga. Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
Sean Long

3
Apakah itu string koneksi Anda di mana-mana ? Alasan saya bertanya, adalah karena string koneksi yang berbeda akan menjadi kolam koneksi yang berbeda.
Thomas Stringer

Itu pertanyaan yang sangat, sangat bagus. Saya memeriksa 3 string koneksi sejauh ini, tetapi mereka semua mendorong untuk kolam max tinggi. Saya akan melihat apakah saya dapat menemukan string lain yang mungkin menyebabkannya.
Sean Long

Jika Anda hanya men-debug eksekusi, Anda harus dapat melihat apa nilai runtime SqlConnection.ConnectionStringuntuk operasi tertentu. Itu akan menjadi cara termudah. Jika max pool sizetidak ada, maka 100 lalu.
Thomas Stringer

1
Ini harus ditandai sebagai jawaban yang diterima karena benar-benar menjawab OP dengan benar. Ia menyebutkan parameter string string Pool Max klien dan kebutuhan untuk menutup / membuang koneksi.
Adam Caviness
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.