분산 개체 캐시를 SQL Server 2008/2012와 동기화

저자: 이크발 칸

NCache 중간 계층에서 애플리케이션에 더 가깝게 데이터를 캐시할 수 있으므로 데이터베이스에 대한 비용이 많이 드는 여행을 줄일 수 있습니다. 이것은 차례로 응용 프로그램의 속도를 크게 높입니다. 또한 데이터베이스의 로드가 줄어들어 하드웨어 업그레이드 없이 더 많은 수의 클라이언트를 처리할 수 있기 때문에 확장성을 높일 수 있습니다.

그러나 데이터를 캐시할 때 실제로는 데이터베이스 외부에 복사본을 만드는 것입니다. 이렇게 하면 데이터베이스의 데이터가 수정되지만 캐시된 복사본이 변경되지 않고 부실해질 위험이 있습니다. 좋은 소식은 이 상황이 데이터베이스의 동일한 데이터를 수정하는 여러 응용 프로그램이 있고 모든 응용 프로그램이 캐시를 업데이트하지 않는 경우에만 발생한다는 것입니다.

다른 응용 프로그램이 데이터베이스의 데이터를 수정하고 캐시를 업데이트하지 않는 상황이 있는 경우 캐시가 데이터베이스와 직접 동기화할 수 있는 메커니즘이 필요합니다. 이것은 여러 가지 방법으로 가능합니다. 데이터베이스가 SQL Server 2008/2012인 경우 캐시는 동기화를 위해 .NET 이벤트 알림을 사용할 수 있으며 이는 매우 효율적입니다. 그러나 데이터베이스가 SQL Server 2000, Oracle 또는 기타 OLEDB 호환 데이터베이스인 경우 동기화하는 유일한 방법은 업데이트를 찾기 위해 데이터베이스를 폴링하는 것입니다. 물론 이 방법은 캐시가 데이터베이스에 불필요한 많은 이동을 하기 때문에 효율적이지 않습니다.

이 기사에서는 어떻게 NCache .NET 이벤트 알림을 사용하여 캐시를 SQL Server 2008/2012 데이터베이스와 동기화합니다.

지정 SqlCacheDependency 코드에서

이 기능을 사용하려면 .NET 애플리케이션 코드에서 지정해야 하는 사항은 다음과 같습니다. NCache Microsoft의 인터페이스와 매우 유사한 인터페이스를 제공합니다. SqlCacheDependency 인터페이스 때문에 내부적으로 NCache 사용 중 SqlCacheDependency SQL Server 2008/2012와 동기화할 개체입니다.

public class Program {

public static void Main(string[] args)
    {
        NCache.InitializeCache("myCache");
        Customer cust = new Customer();
        cust.CustomerID = "ALFKI";
        LoadCustomer(cust);

        List<Customer> custList = FindCustomers("San Francisco");

        // Do your regular work here...

        NCache.Cache.Dispose();
    }

// A standard Load method that loads a single row from database
public Customer LoadCustomer(Customer cust)
    {
        String key = "Customer:CustomerID:" + cust.CustomerID;
        Customer cust2 = (Customer)NCache.Cache.Get(key);
        if (cust2 != null)
        return cust2;

        CustomerFactory custFactory = new CustomerFactory();

        // Load a single customer from the database
        // SELECT * FROM Customers WHERE CustomerID = 'ALFKI'
        custFactory.Load(cust);

        // Create a SqlCacheDependency for this item
        CacheItem item = new CacheItem(cust);
        item.Dependency = SqlDependencyFactory.CreateSqlYukonDependency(connectionString,
        "SELECT CustomerID FROM Customers WHERE CustomerID = '" + cust.CustomerID + "'");

        // Store item in the cache along with SqlCacheDependency
        NCache.Cache.Insert(key, item);
        return cust;
    }

    // A query method
    public List<Customer> FindCustomers(String city)
        {
            String key = "List<Customer>:City:" + city;
            List<Customer> custList = (List<Customer>)NCache.Cache.Get(key);
            if (custList != null)
            return custList;

        CustomerFactory custFactory = new CustomerFactory();

        // Load a list of customers from database based on a criteria
        // SELECT * FROM Customers WHERE City = 'San Francisco'
        custList = custFactory.FindByCity(city);

        // Create a SqlCacheDependency for this list of customers
        CacheItem item = new CacheItem(custList);
        item.Dependency = SqlDependencyFactory.CreateSqlYukonDependency(connectionString,
        "SELECT CustomerID FROM Customers WHERE City = '" + city + "'");

        // Store list of customers in the cache along with SqlCacheDependency
        NCache.Cache.Insert (key, item);
        return custList;
    }
}

위의 코드는 다음을 지정할 수 있는 두 가지 상황을 보여줍니다. SqlCacheDependency. 첫 번째는 데이터베이스에서 단일 행을 로드하고 이를 객체로 변환한 후 캐시에 저장하는 경우입니다. 이 경우 이 단일 행을 가져오기 위해 코드에서 사용한 것과 동일한 SQL 문을 지정해야 합니다. 그런 다음 이 SQL 문은 다음에서 사용됩니다. SqlCacheDependency 개체를 사용하여 데이터베이스와의 연결을 설정하고 SQL Server 2008/2012가 .NET 이벤트 알림을 보내야 하는 행을 등록합니다.

두 번째 상황은 데이터베이스에서 개체 컬렉션으로 행 컬렉션을 가져온 다음 전체 컬렉션을 캐시에 개별 개체로 저장하는 경우입니다. 이 경우 생성해야 하는 SqlCacheDependency 동일한 SQL 문을 사용하여 데이터베이스에서 방금 수행한 것과 동일한 행을 가져옵니다. 이 방법, NCache 이 행 중 하나라도 변경되면 .NET 이벤트 알림을 보내야 함을 SQL Server 2008/2012에 알립니다. NCache.

위의 코드 예제는 다음을 지정해야 하는 대부분의 상황을 다룹니다. SqlCacheDependency 귀하의 코드에서. 또 다른 상황은 관련 개체 모음을 고객에게 가져오려고 할 때입니다(예: 1-n 관계). 이 상황에서는 Customer 개체 컬렉션을 가져오기 위해 수행한 작업을 정확히 수행하게 됩니다. 변경되는 유일한 것은 관련 개체를 가져오는 데 사용되는 SQL 문입니다.

당신이 제공하는 SQL 문에 유의하십시오. CreateSqlYukonDependency() 메서드를 사용해서는 안 됩니다. "SELECT * ..." 체재. 의 일부로 하나 이상의 열 이름을 지정해야 합니다. SELECT 성명. 그렇지 않으면, SqlCacheDependency 작동하지 않습니다.

SQL Server 2008/2012에서 Service Broker 활성화

먼저 SQL Server 2008/2012에서 서비스 브로커를 활성화해야 합니다. NCache 사용할 수 있습니다 SqlCacheDependency. 이를 통해 SQL Server 2008/2012에서 이벤트 알림을 보낼 수 있습니다. NCache 데이터베이스에서 데이터가 변경되었음을 알립니다.

ALTER DATABASE Northwind SET ENABLE_BROKER;
GO

참고하여 주시기 바랍니다 NCache 자동으로 전화 SqlCacheDependency.Start() 자체 코드 내에서 메서드. 당신은 결코 직접적으로 상호 작용하지 않습니다 SqlCacheDependency 따라서 전화를 걸 필요가 없습니다 "Start()" 그것에 방법.

애플리케이션 실행

이제 다음을 수행하는 애플리케이션을 실행할 준비가 되었습니다. NCache 캐시 데이터를 호출합니다. 이제 무엇이든 캐시할 때마다 NCache, NCache SQL Server 2008/2012에 이를 알리고 SQL Server 2008/2012에서 이 데이터가 변경되면 .NET 이벤트 알림을 다음으로 보냅니다. NCache. NCache 그런 다음 데이터베이스에서 변경되었기 때문에 캐시에서 이 데이터를 제거합니다. 이렇게 하면 다음에 애플리케이션에 이 데이터가 필요할 때 캐시에서 찾지 못하고 데이터베이스로 이동하여 가져온 다음 캐시에 저장합니다.

결론

보시다시피 NCache 분산 캐시를 SQL Server 2008/2012 데이터베이스와 매우 간단하게 동기화할 수 있습니다. 이제 캐시가 데이터베이스와 동기화되지 않는다는 사실을 알고 안심할 수 있습니다.


저자: 이크발 칸(Iqbal Khan)이 근무하는 곳 Alachisoft , .NET 및 Java 분산 캐싱, O/R 매핑 및 SharePoint 스토리지 최적화 솔루션을 제공하는 선도적인 소프트웨어 회사입니다. 당신은 그에게 연락할 수 있습니다 이크발@alachisoft.COM.

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