폴링을 통해 분산 캐시를 데이터베이스와 동기화

개요

NCache 데이터베이스에 대한 값비싼 이동을 줄이면서 애플리케이션 속도를 높이는 데 도움이 되는 분산 캐싱 솔루션입니다. 그러면 많은 수의 클라이언트가 데이터베이스에서 캐시로 이동되기 때문에 확장성이 추가되어 데이터베이스에 대한 부하가 줄어들고 하드웨어를 업그레이드할 필요가 없습니다.

데이터가 캐시에 추가되면 실제로 데이터베이스의 원본 데이터 복사본을 캐시에 넣습니다. 데이터베이스의 특정 데이터가 업데이트되면 캐시의 해당 복사본은 영향을 받지 않은 상태로 유지되므로 오래되지 않습니다. 그러나 이러한 상황은 데이터베이스에서 동일한 데이터를 업데이트하는 여러 응용 프로그램이 있지만 모든 응용 프로그램이 캐시의 데이터 업데이트를 담당하는 것은 아닌 경우에만 발생합니다.

일부 응용 프로그램이 데이터베이스의 데이터를 업데이트하지만 캐시를 업데이트하지 않는 이러한 상황에서 데이터베이스의 데이터를 수정하면 캐시의 데이터에도 영향을 미치도록 캐시를 데이터베이스와 동기화하는 방법이 필요합니다. 이는 이벤트 알림을 활성화하거나 데이터베이스를 폴링하여 업데이트를 찾음으로써 달성할 수 있습니다. 그러나 응용 프로그램이 SQL Server 2000, 이전 버전의 Oracle 또는 이벤트 알림을 지원하지 않는 기타 OLEDB 호환 데이터베이스와 같은 데이터베이스 중 하나를 사용하는 경우 해당 데이터베이스와 동기화하는 유일한 방법은 폴링을 사용하는 것입니다.

이 기사의 추가 내용에서는 방법을 연구할 것입니다. NCache 폴링을 사용하여 캐시를 데이터베이스와 동기화합니다.

코드에서 DbDependency 사용

다음은 폴링을 통해 데이터베이스를 캐시와 동기화하기 위해 애플리케이션에서 구현해야 하는 예제 코드입니다.

String conString = "Provider=OraOLEDB.Oracle;User Id=SYSTEM;" +
"Password=xe;Data Source=xe;OLEDB.NET=true;";

OleDbConnection con = new OleDbConnection(conString);
con.Open();

String sqlCmd = "SELECT ProductID, ProductName FROM dbo.Products WHERE ProductID < 12";

OleDbCommand cmd = new OleDbCommand(sqlCmd,con);
cmd.ExecuteReader();

OleDbDataReader myReader = cmd.ExecuteReader();

List<Products> lstProducts = new List<Products>();
while (myReader.Read())
    {
        Products cProducts = new Products();
        cProducts.ProductID = myReader.GetInt32(0);
        cProducts.ProductName = myReader.GetString(1);
        cProducts.SupplierID = myReader.GetInt32(2);
        cProducts.UnitPrice = myReader.GetDecimal(4);

        CacheItem item = new CacheItem(cProducts);

        DBCacheDependency dependency =
        DBDependencyFactory.CreateOleDbCacheDependency(conString,"");

        _cache.Insert(cProducts.ProductID + ":dbo.Products", cProducts,
        dependency, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
        CacheItemPriority.Default);

        lstProducts.Add(cProducts);
    };
myReader.Close();
con.Close();

위의 코드에서 데이터베이스의 단일 행이 로드되어 객체로 변환됩니다. 나중에 CreateOleDbCacheDependency를 사용하여 데이터베이스와의 연결을 설정하고 해당 행을 등록합니다. NCache 업데이트를 찾아야 합니다. CreateOleDbCacheDependency를 사용하여 OleDB 종속성을 만들 때 특정 행을 가져오기 위해 이전에 코드에서 사용한 것과 동일한 SQL 문을 제공해야 합니다.

위의 코드가 구현되고 실행되면 NCache 지정된 정리 간격마다 데이터베이스로 계속 이동하여 업데이트된 행을 가져온 다음 캐시에서 해당하는 만료된 행으로 교체합니다.

데이터베이스 구성

우리는 이미 위의 코드에서 어떻게 NCache 데이터베이스와 동기화를 구현합니다. 그러나 폴링 기반 동기화를 활성화하는 절차에는 아래에서 볼 수 있는 몇 가지 단계가 더 필요합니다.

  1. 테이블 만들기 'ncache_db_sync'를 Oracle 데이터베이스에 추가하고 (1) cache_key VARCHAR2, (2) cache_id VARCHAR2, (3) 수정된 NUMBER 및 (4) work_in_progress NUMBER의 XNUMX개 필드를 추가합니다.
  2. 다음은 테이블 생성을 위한 SQL입니다.

    Create table ncache_db_sync
        (
            cache_key varchar2(256) not null enable,
            cache_id varchar2(256) not null enable,
            modified number(2,1) default 0 not null enable,
            work_in_progress number(2,1) default 0 not null enable,
            primary key (cache_key, cache_id) enable
        );
  3. 알림이 필요한 모든 테이블에 대해 UPDATE 및 DELETE 트리거를 만듭니다. 트리거는 해당 행의 '수정된' 필드를 설정하는 데 사용됩니다. ncache_db_sync 테이블을 1로 변경합니다.
  4. /*Here is the SQL to create the trigger:*/
    Create Trigger MyTrigger
    After
    Update [or delete] on dbo.Products
    Referencing OLD AS oldRow
    For each row
     
     Begin
     Update ncache_db_sync
     Set modified = 1
     Where cache_key = (Cast(Select oldRow.ProductID FROM deleted OLD) As VarChar)
    + ':dbo.Products'
    End Trigger;

참고 : cache_key는 캐시에 해당 레코드를 추가하는 데 사용된 것과 동일한 키여야 합니다.

방아쇠를 당기는 방식과 'ncache_db_sync' 테이블이 작동하는 것은 데이터베이스 테이블의 값이 변경되거나 삭제될 때마다 적절한 트리거가 자동으로 호출된다는 것입니다. 트리거는 '의 '수정된' 필드 값을 변경합니다.ncache_db_sync' 테이블을 1로 변경하여 기본 키 값이 수정되었음을 나타냅니다.

XNUMXD덴탈의 NCache 지정된 기간마다 캐시에서 만료되고 불필요한 항목 정리를 수행합니다. 이 기간을 클린 인터벌이라고 합니다. 모든 청소 간격에서 NCache '에서 '수정된' 필드의 값도 찾습니다.ncache_db_sync' 테이블. 값이 '1'인 경우 NCache 그런 다음 캐시에서 적절한 만료된 키를 제거하고 데이터베이스에서 업데이트된 모든 행을 가져와 캐시에 넣습니다.

배송 시 요청 사항:

  1. 이것은 행 기반 종속성입니다. 캐시 키는 테이블의 기본 키 값과 연결됩니다. 이는 해당 기본 키가 있는 행이 변경된 경우에만 항목이 만료됨을 의미합니다.
  2. cache_key 값은 캐시에 해당 레코드를 추가하는 데 사용된 값과 동일해야 합니다.

다음에 무엇을할지?

© 저작권 Alachisoft 2002 - . 판권 소유. NCache 는 Diyatech Corp.의 등록상표입니다.