SQL Server의 SqlDependency 개체로 인한 메모리 누수 해결
SQL Server 데이터 변경 사항을 모니터링하는 데 중요한 SqlDependency 개체는 메모리에 축적되어 서버 성능에 부정적인 영향을 미칠 수 있습니다. 이 문서에서는 만료된 개체를 효과적으로 제거하는 방법을 자세히 설명합니다.
문제 이해
SqlDependency 개체가 이벤트를 트리거하면 지속적인 모니터링을 위해 새 개체가 필요합니다. 그러나 이전 개체는 메모리에 남아 있어 리소스가 고갈될 수 있습니다.
메모리 정리 절차
다음 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>
이 스크립트는 연결이 끊겼거나 취소된 상태의 대화 끝점을 대상으로 합니다.
대체 접근 방식: SqlDependencyEx
기능을 개선하고 표준 SqlDependency 클래스에 내재된 잠재적인 문제를 방지하려면 오픈 소스 대안인 SqlDependencyEx를 사용하는 것이 좋습니다. 이 솔루션은 데이터베이스 트리거와 기본 Service Broker 알림을 활용합니다.
SqlDependencyEx를 사용한 예시
다음은 SqlDependencyEx를 보여주는 코드 예제입니다.
<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 detection. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
SqlDependencyEx를 사용한 실시간 변경 알림을 보여줍니다.
위 내용은 SQL Server 메모리에서 만료된 SqlDependency 개체를 정리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!