문제:
SQL Server의 SqlDependency
개체는 만료 후에도 메모리에 유지되므로 메모리 사용량이 증가하고 서버 충돌이 발생할 수 있습니다. 이 문서에서는 이러한 느린 쿼리를 사전에 제거하는 방법을 설명합니다.
해상도:
SqlDependency.Stop()
을 사용한 후에도 데이터베이스에는 대화 그룹 및 엔드포인트 등의 잔재가 남아 있습니다. 이 문제를 해결하려면 다음 SQL 스크립트를 실행하세요.
<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>
SqlDependency
단점:
SqlDependency
의 주요 제한 사항은 재구독 중 모든 테이블 수정에 대한 알림 범위가 불완전하다는 것입니다.
우월한 대안: SqlDependencyEx
오픈 소스 SqlDependencyEx
라이브러리는 데이터베이스 트리거와 Service Broker 알림을 활용하여 SqlDependency
의 단점을 극복합니다. 예시적인 사용 예는 다음과 같습니다.
<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 modifications. MakeTableInsertDeleteChanges(changesCount); // Allow time for change reception. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
SqlDependencyEx
을 사용하면 표준 SqlDependency
클래스에 내재된 메모리 관련 문제를 방지하면서 테이블 변경 사항을 추적하기 위한 보다 강력한 솔루션을 제공합니다.
위 내용은 메모리 누수를 방지하기 위해 SQL Server에서 만료된 SqlDependency 개체를 정리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!