我正在集成SqlCacheDependency以在我的LinqToSQL datacontext中使用.
我在这里找到Linq查询的扩展类 - http://code.msdn.microsoft.com/linqtosqlcache
我已经连接了代码,当我打开页面时,我得到了这个例外 -
"未启用当前数据库的SQL Server Service Broker,因此不支持查询通知.如果您希望使用通知,请为此数据库启用Service Broker."
它来自global.asax中的这个事件
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
//In Application Start Event
System.Data.SqlClient.SqlDependency.Start(new dataContextDataContext().Connection.ConnectionString);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是......
如何在我的SQL Server 2008数据库中启用Service Broker?我试图运行此查询.. ALTER DATABASE tablename SET ENABLE_BROKER但它永远不会结束并且永远运行,我必须手动停止它.
一旦我在SQL Server 2008中设置了这个设置,它会过滤到我的DataContext,还是我还需要配置它?
谢谢你的帮助
Truegilly
我正在开发一个项目,我们正在考虑在SQL Server 2005/2008中使用SQLCacheDependency,我们想知道这将如何影响系统的性能.
所以我们想知道以下问题
SQLCacheDependency对象(查询通知)的数量是否会对SQL Server性能产生负面影响,即对受影响的表进行插入,更新和删除操作?
单个表上的50000个不同查询通知在SQL Server 2005/2008中对该表的插入和删除有什么影响(性能方面).
有没有关于如何使用SQLCacheDependencies的建议?任何官方的做什么和不该做什么?我们在互联网上找到了一些信息,但没有找到有关性能影响的信息.
如果这里有人对这些问题有一些答案,那就太好了.
我无法弄清楚为什么HasChanged我的SqlCacheDependency对象的值最初从命令执行返回为false,但几乎在它从数据库返回后的某个地方,值变为true.
有时这会在项目被插入缓存之前发生,导致缓存立即丢弃它,有时它在插入之后,我可以抓住一个枚举器,它在缓存中看到密钥但在我甚至循环到该项目之前缓存它已被删除.
存储过程:
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
Run Code Online (Sandbox Code Playgroud)
数据库是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
Run Code Online (Sandbox Code Playgroud)
调用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)
{
// …Run Code Online (Sandbox Code Playgroud) 我一直在做一些研究,我可以看到这个系统的大部分管道,但是我不知道sql服务器如何知道何时在表中的数据发生变化时将消息发送回任何监听器(应用程序),例如.我将首先解释我理解的内容,直到我迷路了.
1)需要在数据库上启用Service Broker,并且需要设置一些权限.
2)应该部署数据库模式.
3)使用aspnet_regsql.exe,为需要缓存数据的数据库和表启用sql缓存依赖(此步骤创建一个表来跟踪表上的更改和触发器以捕获更改并在该表中增加值).
4)在.net应用程序中设置sql缓存依赖项.例如,在Web应用程序中,您需要为轮询时间,连接字符串等添加配置值; 启动/停止global.asax.cs中的依赖项,然后在向缓存中添加项目时添加sql缓存依赖项.
4a)启动依赖关系时发生的部分事情是为队列,服务和sproc设置基础结构,以便之后进行通信和清理.使用Sql Query Profiler,您可以看到正在建立的连接以及在服务上设置的通信通道,以便应用程序从sql server接收消息.
5)这是我感到困惑的地方.此时,我已经在应用程序缓存中缓存了一个项目,并引用了基础表上的sql缓存依赖项,以便我的应用程序可以在行更改时收到更改.如果我在该行上手动运行更新,我可以看到触发器被命中并且跟踪表中的值增加1.但是,我没有看到任何通信返回到应用程序,sql查询分析器上没有任何内容,也没有是从缓存中删除的项目.我也没有在数据库的队列中看到任何内容(动态应用程序队列和标准错误/传输队列)
我的问题是,什么在数据库中观察跟踪表,以便可以将消息发送回与此数据更改有关的sql依赖项?
非常感谢任何帮助...我一直在搜索许多在线参考资料,但无法找到任何具体的解释.
我有一个ASP.NET应用程序,它广泛使用ASP.NET缓存API来缓存常用数据.另外,我使用基于轮询的sql缓存依赖来跟踪到期.
当前设计的缺点是,在Web场环境中,每个Web服务器都有自己的数据缓存,而不是跨服务器共享.
有没有办法可以简单地迁移代码以跨多个服务器共享数据缓存?
我曾经想过使用memcached,但这不适用于sql cache依赖,对吗?
还有其他方法吗?
所以我有一个在午夜运行的进程,它为flash对象设置一个起点和终点.这只需要每天运行一次,所以我显然是在缓存结果集.
但是,我遇到的问题是,如果数据仍然在midnite之后缓存,则它不会提取最正确的数据,直到缓存过期.
我基本上需要缓存在晚上11:59:59到期,以便在凌晨12:00获得正确的数据.
我猜测桌面上的SQL缓存依赖性我将从中提取数据是理想的,但我以前从未设置过.
有没有办法告诉缓存在正确的midnite删除特定的项目?
多谢你们!
- 绝对期满---
我想我明白了:
DateTime expireWeights = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59, 999);
Cache.Insert("CacheItemName", itemToCache, null, expireWeights, System.Web.Caching.Cache.NoSlidingExpiration);
Run Code Online (Sandbox Code Playgroud) 我试过阅读ASP.NET中的缓存,但仍然有一些问题.
使用Sql Cache Dependency时...我知道您可以指定将监视哪些表,但如果其中任何一个表发生更改,它是否会重置整个缓存?我知道我不想缓存频繁更改的表,但我们最终会得到一些缓存的表,即使每个表每天只获得一些更新,也可能会变成50%的缓存重置每天(8小时窗口).
我将通过GAC DLL创建和维护此缓存.大量不同的应用程序将在任何时候访问该GAC.每个应用程序是否都维护自己的缓存副本,还是只存储在一个全局位置(或者可能是每个应用程序池)?
在服务器上是否有物理位置,我可以看到Cache当前消耗了多少空间?如果每个应用程序都维护自己的缓存,那么这将是非常相关的,因为这可能最终占用大量磁盘空间.
有没有办法物理强制缓存重建自己?我可以看到我的老板认为缓存是针对特定问题的错误而且我需要能够在最严格的级别上排除这一点.没有"改变记录并说应该重建缓存",而是"做[行动X]并且知道缓存中的任何内容现在已经消失"
提前感谢您的答案和时间.
我正在尝试在 ASP.Net core 应用程序中实现缓存。目前我已经实现的是内存缓存IMemoryCache,但我想要的是如果 SQL Server 2016 中的相应记录发生更改,缓存应该失效。我找到它的一种方法,但根据此链接,SQLCacheDependency它不是 .Net Core 的一部分
对此有什么想法吗?
我阅读的几乎每个教程似乎都错误地设置了SqlCacheDependency。我相信他们通常会将过时的轮询方法与查询通知方法混合在一起。
这是许多示例中的两个:
根据我的测试,如果您正在使用代理(MSSQL 2015+),则无需进行任何.config更改,也不需要进行任何SqlCacheDependencyAdmin调用(无需定义表等)。
我简化只是做...
SqlDependency.Start(connString)
...
queryString = "SELECT ...";
cacheName = "SqlCache" + queryString.GetHashCode();
...
using (var connection = new SqlConnection(connString))
{
connection.Open();
var cmd = new SqlCommand(queryString, connection)
{
Notification = null,
NotificationAutoEnlist = true
};
var dependency = new SqlCacheDependency(cmd);
SqlDataReader reader = cmd.ExecuteReader();
try
{
while (reader.Read())
{
// Set the result you want to cache
data = ...
}
}
finally
{
reader.Close();
}
HostingEnvironment.Cache.Insert(cacheName, data, …Run Code Online (Sandbox Code Playgroud) asp.net ×5
caching ×4
c# ×2
.net ×1
.net-core ×1
asp.net-3.5 ×1
asp.net-core ×1
datacontext ×1
linq ×1
memcached ×1
sql ×1
sql-server ×1