다음을 통해 공유


ASP.NET 애플리케이션의 SqlDependency

ADO.NET 다운로드

이 단원의 예제에서는 ASP.NET SqlDependency 개체를 사용해 SqlCacheDependency를 간접적으로 사용하는 방법을 보여 줍니다. SqlCacheDependency 개체에서는 SqlDependency를 사용하여 알림을 수신하고 캐시를 올바르게 업데이트합니다.

참고 항목

이 샘플 코드에서는 사용자가 쿼리 알림 사용의 스크립트를 실행하여 쿼리 알림을 사용하도록 설정했다고 가정합니다.

샘플 애플리케이션 정보

애플리케이션 예제에서는 단일 ASP.NET 웹 페이지를 사용하여 AdventureWorks SQL Server 데이터베이스의 제품 정보를 GridView 컨트롤에 표시합니다. 페이지가 로드되면 코드는 Label 컨트롤에 현재 시간을 씁니다. 그런 다음 SqlCacheDependency 개체를 정의하고 최대 3분 동안 캐시 데이터를 저장하도록 Cache 개체의 속성을 설정합니다. 그런 다음 코드에서는 데이터베이스에 연결하여 데이터를 검색합니다. 페이지가 로드되고 애플리케이션이 실행되면 ASP.NET이 캐시에서 데이터를 검색합니다. 여기서 페이지의 시간이 변경되지 않는지를 보고 확인할 수 있습니다. 모니터링되는 데이터가 변경되면 ASP.NET은 캐시를 무효화한 다음 GridView 컨트롤을 새 데이터로 다시 채우고 Label 컨트롤에 표시된 시간을 업데이트합니다.

샘플 애플리케이션 만들기

샘플 애플리케이션을 만들고 실행하려면 다음 단계를 따릅니다.

  1. 새 ASP.NET 웹 사이트를 만듭니다.

  2. Default.aspx 페이지에 LabelGridView 컨트롤을 추가합니다.

  3. 페이지의 클래스 모듈을 열고 다음 지시문을 추가합니다.

    using Microsoft.Data.SqlClient;
    using System.Web.Caching;
    
  4. 페이지의 Page_Load 이벤트에 다음 코드를 추가합니다.

    // using Microsoft.Data.SqlClient;
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = "Cache Refresh: " +
        DateTime.Now.ToLongTimeString();
    
        // Create a dependency connection to the database.
        SqlDependency.Start(GetConnectionString());
    
        using (SqlConnection connection =
            new SqlConnection(GetConnectionString()))
        {
            using (SqlCommand command =
                new SqlCommand(GetSQL(), connection))
            {
                SqlCacheDependency dependency =
                    new SqlCacheDependency(command);
                // Refresh the cache after the number of minutes
                // listed below if a change does not occur.
                // This value could be stored in a configuration file.
                int numberOfMinutes = 3;
                DateTime expires =
                    DateTime.Now.AddMinutes(numberOfMinutes);
    
                Response.Cache.SetExpires(expires);
                Response.Cache.SetCacheability(HttpCacheability.Public);
                Response.Cache.SetValidUntilExpires(true);
    
                Response.AddCacheDependency(dependency);
    
                connection.Open();
    
                GridView1.DataSource = command.ExecuteReader();
                GridView1.DataBind();
            }
        }
    }
    
  5. GetConnectionStringGetSQL의 두 가지 도우미 메서드를 추가합니다. 정의된 연결 문자열은 통합 보안을 사용합니다. 사용 중인 계정에 필요한 데이터베이스 권한이 있는지와 샘플 데이터베이스 AdventureWorks에서 알림을 사용하도록 설정했는지 확인합니다.

    // using Microsoft.Data.SqlClient;
    private string GetConnectionString()
    {
        // To avoid storing the connection string in your code,
        // you can retrieve it from a configuration file.
        return "Data Source=(local);Integrated Security=true;" +
          "Initial Catalog=AdventureWorks;";
    }
    private string GetSQL()
    {
        return "SELECT Production.Product.ProductID, " +
        "Production.Product.Name, " +
        "Production.Location.Name AS Location, " +
        "Production.ProductInventory.Quantity " +
        "FROM Production.Product INNER JOIN " +
        "Production.ProductInventory " +
        "ON Production.Product.ProductID = " +
        "Production.ProductInventory.ProductID " +
        "INNER JOIN Production.Location " +
        "ON Production.ProductInventory.LocationID = " +
        "Production.Location.LocationID " +
        "WHERE ( Production.ProductInventory.Quantity <= 100 ) " +
        "ORDER BY Production.ProductInventory.Quantity, " +
        "Production.Product.Name;";
    }
    

애플리케이션 테스트

애플리케이션에서는 Web Form에 표시된 데이터를 캐시하고 활동이 없으면 3분마다 새로 고칩니다. 데이터베이스가 변경되면 즉시 캐시를 새로 고칩니다. Visual Studio에서 애플리케이션을 실행합니다. 그러면 페이지가 브라우저로 로드됩니다. 표시된 캐시 새로 고침 시간은 캐시가 마지막으로 새로 고쳐진 시간을 나타냅니다. 3분을 기다렸다 페이지를 다시 고쳐서 포스트백 이벤트가 발생하도록 합니다. 페이지에 표시된 시간이 변경됩니다. 3분이 지나기 전에 페이지를 새로 고치면 페이지에 표시된 시간이 동일하게 유지됩니다.

이제 Transact-SQL UPDATE 명령을 사용하여 데이터베이스의 데이터를 업데이트하고 페이지를 새로 고칩니다. 이제 표시된 시간을 보면 캐시가 데이터베이스의 새 데이터로 새로 고쳐졌음을 알 수 있습니다. 캐시를 업데이트하는 경우에도 페이지에 표시되는 시간은 포스트백 이벤트가 발생할 때까지 변경되지 않습니다.

다음 단계