Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyelesaikan Kebocoran Memori Pelayan SQL yang Disebabkan oleh Objek SqlDependency Tamat Tempoh?
Masalahnya:
Aplikasi yang menggunakan kelas SqlDependency
untuk pemantauan perubahan pangkalan data SQL Server boleh mengalami kebocoran memori. Objek SqlDependency
tamat tempoh terkumpul dalam ingatan, sumber sistem yang berpotensi meletihkan.
Punca Punca:
SqlDependency
mewujudkan sambungan pelayan dan mendaftarkan pemberitahuan jadual. Walaupun selepas penyingkiran ketergantungan atau keluaran sumber (SqlCommand
, SqlConnection
), kumpulan perbualan dan titik akhir yang berkaitan kekal dalam pangkalan data, memakan memori.
Penyelesaian: Pembersihan Pangkalan Data
Untuk menuntut semula memori yang diduduki oleh objek SqlDependency
tamat tempoh, laksanakan skrip SQL ini dalam pangkalan data yang terjejas:
<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>
Had Kebergantungan Sql:
Di luar pengurusan ingatan, SqlDependency
mempunyai batasan yang wujud:
Alternatif: Perpustakaan SqlDependencyEx
Untuk kebolehpercayaan yang lebih baik dan penjejakan perubahan yang menyeluruh, pertimbangkan pustaka SqlDependencyEx
sumber terbuka. Ia menggunakan pencetus pangkalan data dan Broker Perkhidmatan untuk pemberitahuan yang lebih mantap:
<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(); // Simulate table changes. MakeTableInsertDeleteChanges(changesCount); // Allow time for change notification. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Kebocoran Memori Pelayan SQL yang Disebabkan oleh Objek SqlDependency Tamat Tempoh?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!