当试图删除过期的SQL记录时,信号量与SQL作业

本文关键字:SQL 信号量 作业 记录 删除 过期 | 更新日期: 2023-09-27 17:50:11

我正在使用ASP。. NET和c#构建一些"社交网络"网站;在添加帖子时,有SQL列填充,添加帖子的日期和时间,以及帖子过期的日期和时间(它在所有类型的帖子之间有所不同…)

我想要一些进程,不断检查SQL数据库和删除与过期日期和时间的帖子。

我已经搜索了解决方案,我明白2个最合适的解决方案是信号量和SQL作业(纠正我,如果我错了)。

我希望你能给我一个提示,什么是最好的解决方案,如果它不是两者之一,它是什么,以及一些关于最佳解决方案的信息…

谢谢!

当试图删除过期的SQL记录时,信号量与SQL作业

仅根据当前时间隐藏已过期的帖子。例如

WHERE ExpiryDateTime > SYSUTCDATE()

然后你可以以任何你喜欢的频率清理后台的旧帖子。创建一个Windows任务调度程序任务,调用您的网站的特殊URL。该URL应该执行数据库清理。这是一个非常简单和明显正确的解决方案。

如果你不喜欢Windows任务调度程序(谁真的喜欢它…),你可以使用调度程序库,如Hangfire或Quartz.Net

都不是

  • 信号量是一种控制多线程间资源使用的方法
  • 一个SQL作业是一个有点生硬的工具,旨在允许数据库管理员调度任务

我会创建一个单独的程序'oldDataDeleter'编码你的逻辑关于你想要删除或归档多少时间后,然后在原子的方式应用该逻辑。我会将其作为带有计时器的windows服务运行,或者将控制台应用程序作为计划任务运行

关键是要确保程序可以与自身并发运行,并且每次只对一小块数据进行小的原子更改。

然后您可以启动该程序的多个实例,以高频率运行。

这可以确保不要用大型的"delete all from table X join table Y"语句锁定数据库,并且可以不断地修剪数据,而不是建立一个大的夜间作业来运行。


编辑"所有代码必须在一个网站项目中"的限制

有另一个解决方案在某些方面更好,并且符合您的需求(有点奇怪,非常而不是最佳实践)。

即在进行插入时删除旧条目。因此,当您的代码添加一个帖子"插入到帖子…",它也运行删除"从帖子中删除…"

这确保您的程序是自我维护的。但是,在添加帖子时确实会导致性能下降。考虑到一个大型社交媒体网站会不断地添加帖子,并且需要随着用户的增长而扩大规模。我不推荐这个解决方案。

但是对于不需要缩放的小项目,它更简洁。