C# 缓存的数据集表行在首次使用后消失

C# 缓存的数据集表行在首次使用后消失,c#,asp.net,caching,C#,Asp.net,Caching,我正在缓存一个非常昂贵的查询,以便在我们的一个类文件中填充4个不同的下拉框。我花了太多的时间尝试我所知道的一切,以使这个工作没有运气。第一次通过时,数据集被缓存,一切看起来都很好。如果刷新页面,代码将通过缓存项的null检查,但是缓存数据集中没有行,并且下拉列表不会填充 据我所知,我正在做这件事,就像MSDN和其他网站上的所有例子一样。我就是无法让缓存保持不变。数据集只有140行,因此不会因大小而被踢出。我试着把它设置为永远不会在没有运气的情况下过期。如果有人能帮助我,我将不胜感激 我已经检查了

我正在缓存一个非常昂贵的查询,以便在我们的一个类文件中填充4个不同的下拉框。我花了太多的时间尝试我所知道的一切,以使这个工作没有运气。第一次通过时,数据集被缓存,一切看起来都很好。如果刷新页面,代码将通过缓存项的null检查,但是缓存数据集中没有行,并且下拉列表不会填充

据我所知,我正在做这件事,就像MSDN和其他网站上的所有例子一样。我就是无法让缓存保持不变。数据集只有140行,因此不会因大小而被踢出。我试着把它设置为永远不会在没有运气的情况下过期。如果有人能帮助我,我将不胜感激

我已经检查了应用程序池的设置,它们似乎在回收之前有足够的时间。最重要的是,当数据集第一次被缓存时,数据就在那里。刷新页面时,数据集列标题位于缓存项中,但没有数据,因此它正在通过null检查。这件事真让我抓狂。我能够缓存字符串,但由于某些原因,数据集不能缓存超过一个请求的时间。从对缓存项设置监视开始,它一直挂起,直到第二次调用该方法,并且当该方法启动时,它清空数据集

我添加了代理CacheItemRemovedCallback,除非手动删除缓存项,否则无法触发它。缓存对象仍在缓存中,数据集行正在消失。如果打开缓存的数据集,则它具有列名,没有行。正因为如此,它正在通过

if(cacheItem == null)
检查。我可以缓存一个没有问题的字符串,它在缓存中一直保留到过期,或者我手动删除它。我真是不知所措。有没有其他方法可以让我尝试缓存该项目?我认为会话不起作用,查询对系统来说太昂贵,无法在会话级别使用它

public DataSet ReturnPhysicianSpecialtyCodes() 
{ 
    string cacheKey = "PhysCodes"; 
    object cacheItem = HttpRuntime.Cache[cacheKey] as DataSet; 
    if(cacheItem == null) 
    { 
        string sqlCommand = 
            "SELECT DISTINCT SPECIALTY_CODE, SPECIALTY " + 
            "FROM   PHARM.PHYSICIAN_SPECIALTY " +
            "ORDER BY SPECIALTY"; 

        cacheItem = OracleHelper.ExecuteDataset(
            this.Connection, 
            CommandType.Text,     
            sqlCommand); 

        HttpRuntime.Cache.Insert( 
            cacheKey, 
            cacheItem, 
            null, 
            Cache.NoAbsoluteExpiration, 
            new TimeSpan(1, 
            0, 0), 
            CacheItemPriority.Default, null); 
        } 
        return (DataSet)cacheItem;            
    }
}

提前感谢大家的帮助。

尝试使用其他容器,如List。使用cmd.ExecuteDatareader填充它并存储在缓存中。工作起来很有魅力。如果只需要绑定下拉列表,那么使用数据集是一种糟糕的做法。

我通常这样做缓存

public DataSet ReturnPhysicianSpecialtyCodes() {
    HttpContext context = HttpContext.Current;
    string cacheKey = "PhysCodes";
    DataSet cacheItem = (DataSet)context.Cache.Get(cacheKey);
    if(cacheItem == null) {
        string sqlCommand =
            "SELECT DISTINCT SPECIALTY_CODE, SPECIALTY " +
            "FROM PHARM.PHYSICIAN_SPECIALTY " +
            "ORDER BY SPECIALTY";
        cacheItem = OracleHelper.ExecuteDataset(
            this.Connection,
            CommandType.Text,
            sqlCommand);
        context.Cache.Add(
            cacheKey,
            cacheItem,
            null,
            Cache.NoAbsoluteExpiration,
            Cache.NoSlidingExpiration,
            CacheItemPriority.Normal,
            null);
    }
    return (DataSet)cacheItem;
}

并不是说这和您正在做的事情有很大区别,而是这对我来说很有用。

我在考虑数据集的XML表示并将其存储在缓存中。你能给我一个小剪报,告诉我如何用我当前的代码来完成它吗?嗨,凯文,谢谢你的例子,我进入了这个网站,并以同样的结果运行了它。从人们建议我尝试的所有不同方式中,我得到了相同的结果。我真的开始认为代码很好,它与IIS或类似的东西有关。我对缓存和IIS设置没有太多经验。