Почему мой SqlCacheDependency HasChanged возвращается false, но почти сразу после изменения на true?

Я не могу понять, почему значение HasChanged моего объекта 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 в рабочем методе предназначен для обхода этих других тестов. Рабочий код помогает определить, должно ли вообще происходить кеширование БД.

Вы можете видеть, что когда "нерабочие" данные извлекаются изначально, все в порядке:

enter image description here

Но где-то случайно за пределами этой точки, в этом случае, просто переход к следующему методу

enter image description here

И все же данные НЕ меняется вообще; Я единственный, кто прикасается к этому экземпляру базы данных.

12
задан the Tin Man 22 December 2011 в 17:08
поделиться