Beberapa hari terakhir kami melihat pesan kesalahan ini terlalu banyak di situs web kami:
"Batas waktu habis. Periode batas waktu berlalu sebelum mendapatkan koneksi dari pool. Ini mungkin terjadi karena semua koneksi pooled digunakan dan ukuran max pool tercapai."
Kami belum mengubah apa pun dalam kode kami untuk sementara waktu. Saya merevisi kode untuk memeriksa koneksi terbuka yang tidak menutup, tetapi ternyata semuanya baik-baik saja.
Bagaimana saya bisa memecahkan masalah ini?
Apakah saya perlu mengedit kumpulan ini?
Bagaimana cara saya mengedit jumlah koneksi maksimal kumpulan ini?
Apa nilai yang disarankan untuk situs web traffic tinggi?
Memperbarui:
Apakah saya perlu mengedit sesuatu di IIS?
Memperbarui:
Saya menemukan bahwa jumlah koneksi aktif di mana saja dari 15 hingga 31, dan saya menemukan bahwa jumlah maksimum koneksi yang diizinkan yang dikonfigurasi dalam SQL server lebih dari 3200 koneksi, 31 terlalu banyak atau haruskah saya mengedit sesuatu dalam konfigurasi ASP.NET ?
sumber
Jawaban:
Dalam kebanyakan kasus, masalah penyatuan koneksi terkait dengan "kebocoran koneksi." Aplikasi Anda mungkin tidak menutup koneksi basis datanya dengan benar dan konsisten. Ketika Anda membiarkan koneksi terbuka, mereka tetap diblokir sampai .NET sampah mengumpulkannya untuk Anda dengan memanggil
Finalize()
metode mereka .Anda ingin memastikan bahwa Anda benar - benar menutup koneksi . Misalnya kode berikut akan menyebabkan kebocoran koneksi, jika kode antara
.Open
danClose
melemparkan pengecualian:Cara yang benar adalah ini:
atau
Ketika fungsi Anda mengembalikan koneksi dari metode kelas, pastikan Anda melakukan cache secara lokal dan memanggil
Close
metode tersebut. Anda akan membocorkan koneksi menggunakan kode ini misalnya:Sambungan kembali dari panggilan pertama ke
getConnection()
tidak ditutup. Alih-alih menutup koneksi Anda, baris ini membuat yang baru dan mencoba untuk menutupnya.Jika Anda menggunakan
SqlDataReader
atauOleDbDataReader
, tutuplah. Meskipun menutup koneksi itu sendiri tampaknya melakukan trik, lakukan upaya ekstra untuk menutup objek pembaca data Anda secara eksplisit saat Anda menggunakannya.Artikel ini " Mengapa Connection Pool Overflow? " Dari MSDN / SQL Magazine menjelaskan banyak detail dan menyarankan beberapa strategi debugging:
sp_who
atausp_who2
. Prosedur yang disimpan sistem ini mengembalikan informasi darisysprocesses
tabel sistem yang menunjukkan status dan informasi tentang semua proses kerja. Secara umum, Anda akan melihat satu ID proses server (SPID) per koneksi. Jika Anda menamai koneksi Anda dengan menggunakan argumen Nama Aplikasi dalam string koneksi, koneksi kerja Anda akan mudah ditemukan.TSQL_Replay
templat SQLProfiler untuk melacak koneksi terbuka. Jika Anda terbiasa dengan Profiler, metode ini lebih mudah daripada polling dengan menggunakan sp_who.sumber
Setelah menginstal .NET Framework v4.6.1 koneksi kami ke basis data jauh segera memulai penghentian karena perubahan ini .
Untuk memperbaikinya cukup tambahkan parameter
TransparentNetworkIPResolution
dalam string koneksi dan setel ke false :sumber
Kecuali jika penggunaan Anda meningkat banyak, tampaknya tidak mungkin hanya ada tumpukan pekerjaan. IMO, opsi yang paling mungkin adalah sesuatu menggunakan koneksi dan tidak segera melepaskannya. Apakah Anda yakin menggunakan
using
semua kasus? Atau (melalui mekanisme apa pun) melepaskan koneksi?sumber
Apakah Anda memeriksa DataReaders yang tidak ditutup dan response.redirects sebelum menutup koneksi atau datareader. Koneksi tetap terbuka saat Anda tidak menutupnya sebelum dialihkan.
sumber
Kami juga menghadapi masalah ini dari waktu ke waktu di situs web kami. Pelakunya dalam kasus kami, adalah statistik / indeks kami semakin ketinggalan zaman. Ini menyebabkan permintaan yang sebelumnya berjalan cepat (akhirnya) menjadi lambat dan waktu habis.
Coba perbarui statistik dan / atau bangun kembali indeks pada tabel yang dipengaruhi oleh kueri dan lihat apakah itu membantu.
sumber
Anda dapat menentukan ukuran kumpulan minimum dan maksimum dengan menentukan
MinPoolSize=xyz
dan / atauMaxPoolSize=xyz
dalam string koneksi. Namun penyebab masalah ini bisa saja berbeda.sumber
Saya juga mengalami masalah ini, ketika menggunakan beberapa lapisan data pihak ke-3 di salah satu aplikasi .NET saya. Masalahnya adalah bahwa layer tidak menutup koneksi dengan benar.
Kami membuang lapisan dan membuat sendiri, yang selalu menutup dan membuang koneksi. Sejak itu kami tidak mendapatkan kesalahan lagi.
sumber
Anda dapat mencobanya juga, untuk memecahkan masalah batas waktu:
Jika Anda tidak menambahkan httpRuntime ke konfigurasi web Anda, tambahkan itu di
<system.web>
tagdan
Ubah string koneksi Anda seperti ini;
Terakhir digunakan
sumber
Hal ini terutama disebabkan oleh koneksi yang belum ditutup dalam aplikasi. Gunakan "MinPoolSize" dan "MaxPoolSize" di string koneksi.
sumber
Dalam kasus saya, saya tidak menutup objek DataReader.
sumber
Jika Anda bekerja pada kode lawas yang kompleks di mana penggunaan sederhana (..) {..} tidak mungkin - seperti saya sebelumnya - Anda mungkin ingin memeriksa cuplikan kode yang saya poskan dalam pertanyaan SO ini untuk cara menentukan panggilan tumpukan penciptaan koneksi ketika koneksi berpotensi bocor (tidak ditutup setelah batas waktu yang ditentukan). Ini membuatnya cukup mudah untuk menemukan penyebab kebocoran.
sumber
Jangan instantiate koneksi sql terlalu banyak. Buka satu atau dua koneksi dan gunakan untuk semua operasi sql berikutnya.
Tampaknya bahkan ketika
Dispose
koneksi terkecuali dilemparkan.sumber
Selain solusi yang diposting ....
Dalam menangani 1000 halaman kode warisan, masing-masing memanggil GetRS yang umum beberapa kali, berikut ini cara lain untuk memperbaiki masalah ini:
Dalam DLL umum yang ada, kami menambahkan opsi CommandBehavior.CloseConnection :
Kemudian di setiap halaman, selama Anda menutup pembaca data, koneksi juga secara otomatis ditutup sehingga kebocoran koneksi dicegah.
sumber
Saya baru saja mengalami masalah yang sama dan ingin berbagi apa yang membantu saya menemukan sumber: Tambahkan nama Aplikasi ke string koneksi Anda dan kemudian motitor koneksi terbuka ke SQL Server
sumber
Masalah ini saya miliki dalam kode saya. Saya akan menempelkan beberapa contoh kode yang saya miliki di bawah kesalahan. Periode waktu habis berlalu sebelum mendapatkan koneksi dari kolam. Ini mungkin terjadi karena semua koneksi gabungan digunakan dan ukuran max pool tercapai.
Anda ingin menutup koneksi setiap saat. Sebelum itu saya tidak menghubungkan kami karena ini saya mendapat kesalahan. Setelah menambahkan pernyataan tutup saya telah mengatasi kesalahan ini
sumber
Anda telah membocorkan koneksi pada kode Anda. Anda dapat mencoba menggunakan menggunakan untuk menyatakan bahwa Anda menutupnya.
https://blogs.msdn.microsoft.com/angelsb/2004/08/25/connection-pooling-and-the-timeout-expired-exception-faq/
sumber
Masalah ini pernah saya temui sebelumnya. Itu akhirnya menjadi masalah dengan firewall. Saya baru saja menambahkan aturan ke firewall. Saya harus membuka port
1433
agar server SQL dapat terhubung ke server.sumber
Gunakan ini:
sumber
SqlConnection.ClearPool
, tetapi apakah itu hanya mencegah koneksi Anda saat ini dilepaskan kembali ke kolam koneksi? Saya pikir ide koneksi pool adalah untuk memungkinkan koneksi yang lebih cepat. Tentunya melepaskan koneksi dari kolam setiap kali selesai dengan berarti koneksi BARU perlu dibuat SETIAP SAAT diperlukan, alih-alih menarik yang cadangan dari kolam? Tolong jelaskan bagaimana dan mengapa teknik ini berguna.Ya, Ada cara untuk mengubah konfigurasi. Jika Anda menggunakan dedicated server dan hanya membutuhkan lebih banyak koneksi SQL, Anda dapat memperbarui entri "max pool size" di kedua string koneksi dengan mengikuti instruksi ini:
Temukan String Koneksi Anda, ini akan terlihat mirip dengan contoh di bawah ini:
"add name =" SiteSqlServer "connectionString =" server = (lokal); database = dbname; uid = dbuser; pwd = dbpassword; pooling = true; seumur hidup koneksi = 120; ukuran kumpulan pool = 25; ""
5. Ubah ukuran kolam maks = nilai X ke ukuran kolam yang diperlukan.
sumber
Pastikan Anda mengatur pengaturan yang benar untuk kumpulan koneksi. Ini sangat penting seperti yang saya jelaskan dalam artikel berikut: https://medium.com/@dewanwaqas/configurations-that-significantly-improves-your-app-performance-built-using-sql-server-and-net- ed044e53b60 Anda akan melihat peningkatan drastis dalam kinerja aplikasi Anda jika Anda mengikutinya.
sumber
Dalam kasus saya, saya memiliki infinite loop (dari get Property yang mencoba mendapatkan nilai dari database) yang terus membuka ratusan koneksi Sql.
Untuk mereproduksi masalah coba ini:
sumber