次のコードを使用して、「People」テーブルの「Name」列の変更に依存してキャッシュしています。ただし、連続して Address 列などの他の列が変更されると、依存関係が発生し、キャッシュが消去されます。(SQL Server 2008 を使用する ASP.NET 4.0)。
public string GetTheVals()
{
string vals = HttpContext.Current.Cache["TheCacheKey__X"] as string;
if (vals == null)
{
con = GetConnection();
SqlCommand cmd = new SqlCommand(@"
SELECT Name
FROM dbo.People
", con);
con.Open();
SqlCacheDependency sqlDependency = new SqlCacheDependency(cmd);
SqlDataReader rdr = null;
StringBuilder builder = new StringBuilder("");
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
builder.Append(rdr[0].ToString());
}
vals = builder.ToString();
HttpContext.Current.Cache.Insert("TheCacheKey__X", vals, sqlDependency, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20));
CloseConnection(con);
}
return vals;
}
結果が変更されたときに発生すると言われていますが、コマンドのクエリにない列の値が変更されたときに発生するのはなぜですか?
デリゲートを OnChange イベントに割り当てることもできます。これは、関連付けられたコマンドの結果が変化したときに発生します。
また、列を明示的に指定する必要があるため、テーブルの他の列が除外されて起動しないことがわかります。
- では、なぜ列名を明示的に指定する必要があるのでしょうか?
- 開発者が何をしているのか (内部結合を使用する場合など) を認識させ、最悪のパフォーマンスを引き起こす依存関係の作成を回避するためだけですか?
SELECT ステートメントの射影された列は明示的に指定する必要があり、テーブル名は 2 部構成の名前で修飾する必要があります。これは、ステートメントで参照されるすべてのテーブルが同じデータベースにある必要があることを意味することに注意してください。
ステートメントでは、アスタリスク (*) または table_name.* 構文を使用して列を指定することはできません。
ステートメントには、サブクエリ、外部結合、または自己結合を含めることはできません。
http://msdn.microsoft.com/en-us/library/ms181122(v=sql.105).aspx