2011-02-11 3 views
0

두 개의 응용 프로그램 (하나는 사용자가 상호 작용하는 ASP.NET 사이트)과 실행을 위해 작업을 예약하는 두 번째 C# 응용 프로그램이 있습니다. C# 응용 프로그램에서 변경 내용 추적에 문제가있어서 사용자의 데이터베이스 업데이트에 응답 할 수 있습니다. 기본 개념은 다음과 같습니다.C# 클라이언트에 의한 SQL Server 2008 변경 추적

사용자가 ASP.NET 웹 사이트를 통해 Products 데이터베이스에 새 행을 추가합니다. C# 응용 프로그램은 새 행을 통보 받아야하며이 새로 생성 된 제품으로 무언가를 수행하기 위해 Quartz.NET 작업을 생성합니다. 제품 세부 정보가 업데이트되면 C# 응용 프로그램에 알림이 보내지고 Quartz.NET 작업이 적절하게 업데이트됩니다.

는 의사 코드 :보다 더 자주하기 때문에

void Execute(...) 
{ 
    var updated = from p in dc.Products where Id == _product.Id && Updated_On > DateTime.Now; 

    if (updated != null) 
     _product = updated; 
} 

:

void Execute(...) 
{ 
    var product = from p in dc.Products where Id == this._product.Id; 

    if (CompareProduct(this._product, product) == false) 
     _product = product; 

    // do work with the product 
} 

또는 타임 스탬프 :

while(true) // it's not really a loop like this, but this suffices 
{ 
    var newProducts = from p in dc.Products where Added_On > DateTime.Now; 

    foreach(Product product in newProducts) 
     CreateNewJob(product); 
} 

그런 다음, 각 작업은 그 변경 사항을 추적에 필요한 개별 열입니다 제품이 변경되지 않을 때마다 매번 변경 사항을 쿼리하는 것보다 나은 해결책이 있습니다. 실행합니까?

데이터가 변경되면 Quartz.NET 작업이 오래된 데이터로 실행되어서는 안된다는 요구 사항이 있습니다. Execute()의 시작 부분에서 가장 최근의 변경 사항이어야합니다. 실행 중에 상태가 바뀌어도 괜찮습니다.

SqlDependency를 살펴 봤지만 읽은 모든 내용은 변경된 내용을 알려주지 않고 변경된 사항 만 알려줍니다. 대용량 데이터베이스가 계속 전체 테이블을 끌어 와서 직접 비교할 수는 없다.

변경 추적도 비효율적 일 수 있습니다. 모든 변경 사항을 풀고 변경된 항목에 해당하는 Quartz.NET 작업을 찾고 최신 데이터로 업데이트해야합니다.

답변

1

아마도 가장 좋은 방법은 기존 방식을 사용하는 것입니다. SQL TIMESTAMP 열을 사용하여 직접 변경 추적을 수행하십시오. 그런 다음 스케줄러는 TIMESTAMP가> [마지막 실행 된 TIMESTAMP] 인 스케줄을 잡기 만하면됩니다. 스케줄이 잡히면 행을 검사하여 TIMESTAMP가 변경되었는지 확인하고 실행하기 전에 새 데이터를 가져올 수 있습니다.

걱정할 테이블이 여러 개인 경우 이제는 좀 더 복잡해집니다.

+0

그래, 나는 이것이 가장 쉬운 방법이라고 생각했다. 감사. 알림은 변경된 사항을 파악하고 작업을 업데이트하여 업데이트하는 등 매우 힘들 수 있습니다. – mfanto