HasChanged
オブジェクトの値がコマンドの実行から最初に false として返される理由がわかりませんSqlCacheDependency
が、データベースから返された直後のどこかで、値が true に変わります。
アイテムがキャッシュに挿入される前にこれが発生し、キャッシュがすぐにアイテムを破棄することもあれば、挿入後であることもあります。キャッシュ内のキーを参照する列挙子を取得できますが、そのアイテムにループする前です。キャッシュは削除されました。
SPROC:
ALTER PROCEDURE [dbo].[ntz_dal_ER_X_Note_SelectAllWER_ID]
@ER_ID int
AS
BEGIN
SELECT
ER_X_Note_ID,
ER_ID,
Note_ID
FROM dbo.ER_X_Note e
WHERE
ER_ID = @ER_ID
END
データベースは MS SQL Server 2008 で、ブローカー サービスが有効で、一部の出力がキャッシュされ、キャッシュされたままになります。たとえば、これは問題なく機能します。
ALTER PROC [dbo].[ntz_dal_GetCacheControllerByEntityName] (
@Name varchar(50)
) AS
BEGIN
SELECT
CacheController_ID,
EntityName,
CacheEnabled,
Expiration
From dbo.CacheController cc
WHERE EntityName = @Name
END
失敗した問題の SPROC を呼び出すコード:
DataSet toReturn;
Hashtable paramHash = new Hashtable();
paramHash.Add("ER_ID", _eR_ID.IsNull ? null : _eR_ID.Value.ToString());
string cacheName = BuildCacheString("ntz_dal_ER_X_Note_SelectAllWER_ID", paramHash);
toReturn = (DataSet)GetFromCache(cacheName);
if (toReturn == null)
{
// Set up parameters (1 input and 0 output)
SqlParameter[] arParms = {
new SqlParameter("@ER_ID", _eR_ID),
};
SqlCacheDependency scd;
// Execute query.
toReturn = _dbTransaction != null
? _dbConnection.ExecuteDataset(_dbTransaction, "dbo.[ntz_dal_ER_X_Note_SelectAllWER_ID]", out scd, arParms)
: _dbConnection.ExecuteDataset("dbo.[ntz_dal_ER_X_Note_SelectAllWER_ID]", out scd, arParms);
AddToCache(cacheName, toReturn, scd);
}
return toReturn;
動作するコード
const string sprocName = "ntz_dal_GetCacheControllerByEntityName";
string cacheControlPrefix = "CacheController_" + CachePrefix;
CacheControl controller = (CacheControl)_cache[cacheControlPrefix];
if (controller == null)
{
try
{
SqlParameter[] arParms = {
new SqlParameter("@Name", CachePrefix),
};
SqlCacheDependency sqlCacheDependency;
// Execute query.
DataSet result = _dbTransaction != null
? _dbConnection.ExecuteDataset(_dbTransaction, sprocName, out sqlCacheDependency, arParms)
: _dbConnection.ExecuteDataset(sprocName, out sqlCacheDependency, arParms);
controller = result.Tables[0].Rows.Count == 0
? new CacheControl(false)
: new CacheControl(result.Tables[0].Rows[0]);
_cache.Insert(cacheControlPrefix, controller, sqlCacheDependency);
}
catch (Exception ex)
{
// if sproc retreival fails cache the result of false so we don't keep trying
// this is the only case where it can be added with no expiration date
controller = new CacheControl(false);
// direct cache insert, no dependency, no expiration, never try again for this entity
if (HttpContext.Current != null && UseCaching && _cache != null) _cache.Insert(cacheControlPrefix, controller);
}
}
return controller;
メソッドがオーバーロードされており、AddToCache
さらに多くのテストが含まれています。作業方法の直接的な_cache.Insert
方法は、これらの他のテストをバイパスすることです。作業コードは、db キャッシュが発生するかどうかを判断するのに役立ちます。
「動作していない」データが最初に取得されると、すべて問題ないことがわかります。
しかし、そのポイントを超えたランダムな場所、この例では、次のメソッドにステップインするだけです
それでも、データはまったく変更されていません。データベースのこのインスタンスに触れているのは私だけです。