0

以下のようなクエリを使用して、大きな結果セットを取得するとします。

Select UserID,FirstName, LastName, City, Age from UserInfo where DateDiff(d,GetDate,LastActiveOn)  > 180

ここで、クエリによって返された各オブジェクトをキャッシュし、オブジェクトが変更されたときにそのオブジェクトを無効にします。したがって、上記の結果セットの各結果をユーザーオブジェクト(DTO)にキャストし、それらをキャッシュに追加するときに、次のように依存関係を追加します。

   while (reader.Read())
                {
                    var user = new UserInfo(reader, false);
                    float distance;
                    if (float.TryParse(reader["Distance"].ToString(), out distance))
                    {
                        user.Distance = distance;
                    }
                    //Add user to Cache
                    string userQuery = "SELECT UserID,FirstName,MiddleName,LastName FROM mydb.dbo.UserInfo where UserID=" + user.UserId.ToString();
                    var cacheDependencyCmd = new SqlCommand(userQuery, con);
                    SqlCacheDependency jobSeekerDependency = new SqlCacheDependency(cacheDependencyCmd);
                TimeSpan timeLeftToExpiration = user.LastActive.AddDays(180) - DateTime.Now;

                DateTime itemExpirationDate = DateTime.Now.AddDays(timeLeftToExpiration.Days);


                string key = "u-" + user.UserId.ToString();
                this.Context.Cache.Insert(key,user.UserId.ToString() + user.LastActiveString , jobSeekerDependency, itemExpirationDate, Cache.NoSlidingExpiration, CacheItemPriority.Normal, new CacheItemRemovedCallback(ItemRemovedCallBack));

しかし、これはうまくいかないようです。sys.dm_qn_subscriptionsにレコードはありません。イベントログにエラーはもうありません(昨日取得し、それらを解決するために適切な手順を実行しました)Sql Profilerを見ると、SqlQueryNotificationストアドプロシージャが約2分ごとに実行されていることがわかります。

では、なぜ依存関係が作成されなかったのでしょうか。別のクエリを使用して依存関係を作成しているためですか?

4

1 に答える 1

0

クエリは同じである必要があります。基本的に、依存関係に基づいてキャッシュを無効にするクエリは、データをフェッチするために使用する必要があるクエリです。

于 2012-04-24T19:56:05.770 に答える