轮询记录状态的替代方法

时间:2018-07-04 20:11:00

标签: sql-server database-design sqlclr

我们当前有一个使用MS SQL Server Enterprise的付款跟踪系统。客户请求服务时,他必须在24小时内付款,否则我们会向他发送短信提醒。我们当前的实施方式只是记录购买的日期和时间,并不断轮询记录以查找“过期”的购买。

这在数据库上产生了很大的负载,我们必须实施某种形式的复制才能将这些操作卸载到另一台服务器上。

我当时在想:是否有一种方法可以将CLR触发器与某种调度程序结合起来,这种调度程序只能在创建购买后的24小时内触发一次?

请记住,我们每小时有成千上万的交易。

1 个答案:

答案 0 :(得分:2)

我不确定您如何认为SQLCLR将解决此问题。我认为这根本不需要在数据库中处理。

由于请求时间没有改变,为什么不将所有请求加载到可以不断访问的基于内存的存储中。您将加载从请求开始的24小时时间,因此您只需要将这些时间与“现在”进行比较即可。如果客户在24小时之前付款,则可以从缓存中删除该条目。否则,轮询过程最终将找到它,对其进行处理,然后将其从缓存中删除。

或者,类似地,您可以使用调度程序,并根据每个请求的24小时从请求时间将将来的事件加载为SMS消息。类似于使用“ AT”安排动作。同样,如果有人在此之前付款,则只需删除预定的任务/事件/提醒。

您将仅存储24小时后的时间和RequestID。如果时间已到,则该服务将使用该RequestID返回数据库,以获取当前信息。

如果在24小时之后付款,您只需要确保从缓存/调度程序中取消列出项目即可。

如果系统崩溃/重新启动,则只需加载所有以下条目:a)未付费,并且b)尚未达到其24小时以后的时间。