如何清理SQL Server以清除过期的SqlDependency对象?从SqlDepedency对象收到事件后,我需要创建一个新事件才能获得新事件.但是,SQL Server进程的内存使用量会增加,直到超出允许的内存(SQL Server Express).如何摆脱旧查询?
码:
// Func: RegisterTableListener
using (SqlConnection cn = new SqlConnection(Properties.Settings.Default.DatabseEventConnectionString))
{
if (cmd == null)
{
cmd = cn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT HostName, LastStatus, LastDetails, xml FROM dbo.[SystemTable]";
}
lock (cmd)
{
cmd.Connection = cn;
cn.Open();
cmd.Notification = null;
// creates a new dependency for the SqlCommand
if (dep == null)
dep = new SqlDependency(cmd);
// creates an event handler for the notification of data
// changes in …Run Code Online (Sandbox Code Playgroud) 很久以前就提出了这个问题,虽然它涵盖了SQL 2005和2008的可能解决方案,但它缺乏一个很好的SQL 2000解决方案,这仍然太常见了.
我需要一种方法来监视数据库表的某些字段以进行更改,并在发生这些更改时通知我的应用程序,以便我可以在本地网络上将它们作为广播消息进行爆炸,任何有客户端的人都可以监听它们并将其显示为警报(想想类似于股市数据达到特定阈值的东西).
我出于几个原因不想轮询数据库.1)我不希望向服务器添加额外的负载.2)我宁愿近乎实时地收到通知,而不是等待轮询频率到期.
现在,我可以将逻辑放在更新数据库的应用程序中,但数据可以从多个来源更新,包括网络,我不想处理通过DMZ边界发送通知的Web服务器等.我不喜欢我不想在20种不同的应用中维持这一点(更具压倒性的问题).
我已经在使用扩展存储过程和触发器的SQL 2000上看到了这一点,但xp似乎很难跨平台,并且在SQL 2005和2008上安装时它们会破坏.也许这只是示例中的错误代码我已经看来,我不确定,但我正在寻找适用于SQL 2000及更高版本的东西.
有任何想法吗?
编辑:
我曾考虑放弃对2000的支持,但这确实无法解决我的问题.我希望解决方案能够在未来几年继续发挥作用.许多微软技术的一个问题是它们不再支持它们.例如,Notification服务执行我需要它做的事情,但是他们决定在2008年弃用它,并且它将在下一个版本中不可用.所以我正在寻找一个很有可能坚持下去的解决方案.