如何将多个不同的数据添加到内存缓存中

本文关键字:添加 数据 内存 缓存 | 更新日期: 2023-09-27 17:56:29

尽管我浏览了很多关于这个概念的文档,但我无法在这个问题上取得任何进展。我有一个wcf服务,可以对Sql Server数据库进行一些查询。当我只缓存一个查询时,它按预期工作,但是当我尝试缓存两个查询时,第二个查询会抛出异常The method has already been invoked。我是这个缓存的新手,所以如果我的 cachce 概念存在小问题或大方法问题,请告诉我。以下是我正在尝试执行的操作的代码片段:

var cachePolicy = new CacheItemPolicy();
var cache = MemoryCache.Default;
firstObject = cache["firstObject"] as string;
if ( firstObject == null )
    using ( var command = new SqlCommand("SELECT * FROM someTable", connection) )
    {
        cachePolicy.ChangeMonitors.Add(new SqlChangeMonitor(new SqlDependency(command, null, 600)));
        ///... I get the data from database and set the firstObject
        cache.Add("firstObject", firstObject , cachePolicy);
    }
secondObject = cache["secondObject"] as string;
if ( secondObject == null )
    using ( var command = new SqlCommand("SELECT * FROM someTable2", connection) )
    {
        cachePolicy.ChangeMonitors.Add(new SqlChangeMonitor(new SqlDependency(command, null, 600)));
        ///... I get the data from database and set the secondObject 
        cache.Add("secondObject", secondObject , cachePolicy);///---> problem occurs here
    }

我也尝试使用cache.Set方法,仍然是相同的例外。

如何将多个不同的数据添加到内存缓存中

每个缓存项需要一个 CacheItemPolicy,因此您的代码应该更像:

var cache = MemoryCache.Default;
var firstObject = cache["firstObject"] as string;
if (firstObject == null)
{
    var cmd = new SqlCommand("SELECT * FROM Table1");
    firstObject = GetFirstObject(cmd);
    var policy = new CacheItemPolicy();
    policy.ChangeMonitors.Add(new SqlChangeMonitor(new SqlDependency(cmd, null, 600)));
    cache.Add("firstObject", firstObject, policy);
}
var secondObject = cache["secondObject"] as string;
if (secondObject == null)
{
    var cmd = new SqlCommand("SELECT * FORM Table2");
    secondObject = GetSecondObject(cmd);
    var policy = new CacheItemPolicy();
    policy.ChangeMonitors.Add(new SqlChangeMonitor(new SqlDependency(cmd, null, 600)));
    cache.Add("secondObject", secondObject, policy);
}

此外,我想你会发现,要使用 SqlDependency 你不能在选择中使用 *,你必须在表上指定所有者。所以

SELECT * FROM Table1 

成为

SELECT Column1, Column1 FROM dbo.Table1

有关更多详细信息,请参阅此处

希望这有帮助