如何将多个不同的数据添加到内存缓存中
本文关键字:添加 数据 内存 缓存 | 更新日期: 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
有关更多详细信息,请参阅此处
希望这有帮助