【问题标题】:How to invalidate ASP.NET cache if data changes in PostgreSql database如果 PostgreSql 数据库中的数据发生更改,如何使 ASP.NET 缓存无效
【发布时间】:2012-10-12 20:06:32
【问题描述】:

ASP.NET/MONO MVC2应用标准ASP.NET Web缓存用于加速数据库访问:

string GetName() {
  // todo: dedect if data has changed and invalidate cache
  var name = (string)HttpContext.Current.Cache["Name"];
  if (name!=null)
    return name;
  name = db.Query("SELECT name from mydata");
  HttpContext.Current.Cache.Insert("Name", name);
  return name;
}

mydata 可以被其他应用程序更改。 在这种情况下,此方法返回错误数据。 在这种情况下如何检测数据是否发生变化并从 PostgreSql 数据库中返回新数据?

如果 mydata 已更改,则可以清除整个 Web 缓存。

【问题讨论】:

    标签: asp.net asp.net-mvc postgresql caching mono


    【解决方案1】:

    最好的方法可能是使用LISTEN and NOTIFY

    让您的应用维护一个后台工作程序,并与数据库建立持久连接。在这方面,发出LISTEN name_changed,然后等待通知。如果 npgsql 支持它,它可能会提供回调;否则你将不得不投票。

    将触发器添加到发出NOTIFY name_changedname 表。

    当您的后台工作人员收到通知时,它可以刷新缓存。

    您甚至可以使用NOTIFY 有效负载选择性地使更改的条目无效。

    【讨论】:

    • 谢谢。看起来工作量很大。 PostgreSql 是否有现成的解决方案,例如 MS SQL 服务器的 SqlCacheDependency?
    • @Andrus 我对此表示怀疑,但我不使用.NET,所以我不确定。出于显而易见的原因,.NET + MS SQL Server 通常有更多的罐头东西。像上面这样的方法应该很容易实现;我为 Java 编写了类似的代码,它只需要一个简单的触发器和几个小类。
    • @Andrus 请参阅npgsql.projects.postgresql.org/docs/manual/UserManual.html 的“处理通知”部分。您想使用“同步通知”模式来避免轮询。从 npgsql 看起来真的很简单。
    • ASP.NET 缓存是应用程序的本地缓存。如果请求完成,线程可能会终止。在这种情况下如何实现后台工作者?我在stackoverflow.com/questions/12880143/… 中发布了有关它的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2020-10-26
    • 2023-02-10
    • 2010-09-27
    • 2014-04-04
    • 1970-01-01
    相关资源
    最近更新 更多