만료된 SqlDependency 개체로 인한 SQL Server 메모리 누수 해결
문제:
SqlDependency
개체를 사용하면 SQL Server의 메모리 사용량이 꾸준히 증가할 수 있습니다. 이는 SqlDependency.Stop()
을 호출하고 SqlCommand
및 SqlConnection
을 해제한 후에도 데이터베이스가 대화 그룹과 엔드포인트를 유지하기 때문입니다. 이러한 축적은 결국 특히 SQL Server Express에서 메모리 고갈로 이어집니다.
해결책:
다음 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 알림을 활용합니다. 예는 다음과 같습니다.
<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
은 뛰어난 변경 내용 추적 기능을 제공하고 표준 SqlDependency
과 관련된 메모리 문제를 제거합니다.
위 내용은 만료된 SqlDependency 개체를 정리하고 SQL Server 메모리 누수를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!