17

VB.net 2010SQL 2008에이 응용 프로그램을 개발하고있었습니다.
db에 대한 업데이트를 클라이언트에 알리고 싶었고 응용 프로그램이 타이머를 사용하여 지정된 분의 변경 사항을 db에 확인하는 데 사용되었습니다. 실제로는 효율적이지 않습니다. query notification, sqldependency, service broker에 대해 읽었지만 클라이언트가 100 대이면 효율적이지 않을 수도 있다는 내용을 읽었으며 쿼리 알림을 사용하여 응용 프로그램에 알림을 보내고 있습니다.
누군가가 내가해야 할 일을 어떻게 도와 줄 수 있습니까? (예제를 사용할 수 있다면 도움이 될 것입니다). 미리 감사드립니다!데이터베이스 (SQL)가 클라이언트 응용 프로그램에 업데이트를 알리거나 푸시하길 원합니다.

답변

16

쿼리 알림은 응용 프로그램에 직접 전달되는 것이 아니라 Service Broker 서비스로 푸시됩니다. 작동 방식을 이해하려면 The Mysterious Notification을 참조하십시오. 귀하의 신청서는 WAITFOR(RECEIVE) 성명 을 데이터베이스에 게시하여 통지를 기다리고 있습니다. 즉, 100 개의 클라이언트가 각각 하나의 SQL Server 작업자 스레드를 사용하고 있음을 의미합니다 (제한적일 경우 max worker threads 옵션 참조). +1 최대 클라이언트 작업 (최대 작업자 스레드 옵션을 부딪힌 후) 프로덕션 작업을 본 적이 있지만 에 대해에 대해 조언합니다.

변경 사항에 대한 서비스 모니터링을 SqlDependency/QueryNotifications를 사용하는 것이 좋습니다. 이 서비스는 예를 들어 WCF를 사용하여 실행중인 모든 앱에 알림을 푸시합니다. 특정 변경 사항 (the row x in table Foo was inserted)이 아닌 일반적인 변경 사항 (the table Foo was changed)을 구독하게됩니다.

일반적으로 SqlDependency/Query 알림은 데이터가 변경되었음을 알리지만 새 데이터를으로 푸시하지 않습니다. 응용 프로그램은 알림을 받으면 쿼리를 다시 실행하여 로컬 데이터 집합을 새로 고쳐야합니다.

3

SqlDependency 클래스를 사용하면주의해야합니다. 메모리 누수가있는 problems입니다. Hovewer에서는 SqlDependency 클래스의 오픈 소스 실현 인 SqlDependencyEx을 사용할 수 있습니다. 데이터베이스 트리거와 네이티브 Service Broker 알림을 사용하여 테이블 변경 사항에 대한 이벤트를 수신합니다. SqlDependecyEx와

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); 

은 삭제하고 INSERT 피하고, 단지 UPDATE를 모니터링 할 수 있습니다 : 이것은 사용 예이다. 희망이 도움이됩니다.