Mengatasi Kebocoran Memori Pelayan SQL Disebabkan oleh Objek SqlDependency Tamat Tempoh
Masalahnya:
Penggunaan memori SQL Server boleh meningkat secara berterusan apabila menggunakan objek SqlDependency
. Ini kerana, walaupun selepas memanggil SqlDependency.Stop()
dan mengeluarkan SqlCommand
dan SqlConnection
, pangkalan data mengekalkan kumpulan perbualan dan titik akhir. Pengumpulan ini akhirnya membawa kepada keletihan memori, terutamanya dalam SQL Server Express.
Penyelesaian:
Skrip SQL berikut membersihkan titik akhir perbualan yang telah tamat tempoh ini:
<code class="language-sql">DECLARE @ConvHandle uniqueidentifier DECLARE Conv CURSOR FOR SELECT CEP.conversation_handle FROM sys.conversation_endpoints CEP WHERE CEP.state = 'DI' or CEP.state = 'CD' OPEN Conv; FETCH NEXT FROM Conv INTO @ConvHandle; WHILE (@@FETCH_STATUS = 0) BEGIN END CONVERSATION @ConvHandle WITH CLEANUP; FETCH NEXT FROM Conv INTO @ConvHandle; END CLOSE Conv; DEALLOCATE Conv;</code>
Laksanakan skrip ini terhadap pangkalan data yang mengalami kebocoran memori.
Had Kebergantungan Sql:
Adalah penting untuk memahami bahawa SqlDependency
tidak sempurna. Ia mungkin terlepas beberapa perubahan jadual, terutamanya yang berlaku semasa proses langganan semulanya.
Pendekatan yang Lebih Baik: SqlDependencyEx
Untuk penyelesaian yang lebih mantap dan boleh dipercayai, pertimbangkan untuk menggunakan SqlDependencyEx
, alternatif sumber terbuka. Ia memanfaatkan pencetus pangkalan data dan pemberitahuan Broker Perkhidmatan untuk pengendalian peristiwa perubahan yang lebih berkesan. Berikut ialah contoh:
<code class="language-csharp">int changesReceived = 0; using (SqlDependencyEx sqlDependency = new SqlDependencyEx( TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) { sqlDependency.TableChanged += (o, e) => changesReceived++; sqlDependency.Start(); // Make table changes. MakeTableInsertDeleteChanges(changesCount); // Wait a little bit to receive all changes. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
SqlDependencyEx
menyediakan penjejakan perubahan yang unggul dan menghapuskan isu ingatan yang berkaitan dengan standard SqlDependency
.
Atas ialah kandungan terperinci Bagaimana untuk Membersihkan Objek SqlDependency yang Tamat Tempoh dan Mencegah Kebocoran Memori SQL Server?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!