1

任务:

每秒将时间戳写入 MS SQL 数据库表。

解决方案:

  1. 按计划写入时间戳的外部应用程序(例如 Sql 代理)。
  2. 存储过程,它在无限循环中写入时间戳。

问题。

  1. 哪种解决方案最好?
  2. 在存储过程中运行无限循环有什么缺点吗?
  3. 服务器重启后如何启动存储过程?
  4. 还有其他解决方案吗?
4

3 回答 3

3
  1. 要么,但我倾向于使用存储过程路由WAITFOR DELAY
  2. 并不真地
  3. sp_procoption 和启动存储过程
  4. 不涉及外部客户端或系统,我想不出任何
于 2010-07-03T13:01:19.843 回答
2

1、两者各有利弊。根据您的环境评估和选择

过程优点:
- 没有每秒一次 SQL 代理处理的开销。(事实上​​,我不认为你可以让 SQL 代理每秒持续启动一次相同的作业。)
- 我不认为 WAITFOR 模式下的过程正在使用资源 - 但你想检查一下

程序失败:
- 如果程序失败(以某种方式停止),它将不会启动。(除非您有一个 SQL 代理作业正在运行以检查该过程是否已停止,在这种情况下最好继续该过程)
- 可能比您想象的更容易停止/中断(并发/死锁,分离的数据库,手动在维护期间停止然后忘记重新启动)

工作优势:
- 如果工作失败(可能数据库不可用),下一个工作仍然会启动

Job Disads:
- 看起来很笨拙,让 SQL 代理每秒运行一次。如果您这样做,请测量所需的服务器开销。
- 如果 SQL 代理失败或停止,作业将不会运行

一个建议:必须每秒一次吗?可以每 5、10、15 或 30 次吗?

2,不应该是任何,除非是上面提到的。确保你不会遇到锁定、阻塞或死锁的情况!

3,就像@gbn 说的,sp_procoption

4,没有什么不涉及基于悲观锁定技术的繁琐技巧,或基于时间戳(不是日期时间)数据类型的拜占庭逻辑。最好的解决方案似乎是将这两个数据库合并为一个的长期解决方案,但这不是短期选择。

出于纯粹的偏执,我会像这样将两者结合起来:

  • 作业设置为每 2、3 或 5 分钟运行一次
  • 更新您的时间采样的作业调用程序,然后等待几秒钟
  • 程序没有停止,所以作业继续运行;作业正在运行时,它不会启动(因为它仍在执行)
  • 如果程序以某种方式死亡,作业将在下次计划运行时再次启动它。
于 2010-07-05T22:19:32.597 回答
1

尝试使用 SQL 服务代理异步执行此操作,其队列系统允许您不会丢失任何数据,即使必须重新启动 SQL Server 服务。我曾经在这种轮询场景中使用过一次。

http://msdn.microsoft.com/en-us/library/ms345108(SQL.90).aspx#sqlsvcbr_topic2

这可能会有所帮助, http: //msdn.microsoft.com/en-us/library/bb839488.aspx

于 2010-07-06T07:15:40.337 回答