SQL Server 메모리에서 만료된 SqlDependency 개체 지우기
SQL Server에서 SqlDependency 개체를 사용하려면 만료된 종속성으로 인한 메모리 누수를 방지하기 위해 신중한 관리가 필요합니다. 이 문서에서는 이를 처리하기 위한 효과적인 전략을 자세히 설명합니다.
SqlDependency의 정리 제한 사항 이해
SqlDependency는 만료된 연결을 자동으로 제거하지 않습니다. Stop()
이 호출되고 연결된 SqlCommand
및 SqlConnection
개체가 해제된 후에도 대화 그룹과 엔드포인트는 데이터베이스에 유지됩니다. 이러한 누적은 상당한 서버 메모리를 소모합니다.
수동 정리를 위한 SQL 쿼리
사용하지 않는 대화 끝점을 수동으로 지우고 메모리를 확보하려면 데이터베이스에서 다음 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 클래스
오픈 소스 SqlDependencyEx
클래스 사용을 고려해 보세요. 테이블 변경 이벤트에 대한 데이터베이스 트리거와 기본 Service Broker 알림을 활용하여 다음과 같은 몇 가지 이점을 제공합니다.
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 changes. MakeTableInsertDeleteChanges(changesCount); // Allow time for change processing. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
이러한 방법을 사용하면 SqlDependency 개체에 대한 효율적인 메모리 관리와 최적의 SQL Server 애플리케이션 성능이 보장됩니다.
위 내용은 SQL Server 메모리에서 만료된 SqlDependency 개체를 효과적으로 제거하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!