我有一个过程,其中运行在应用程序服务器中的程序必须访问 Oracle 数据库服务器中的表,只要该表中至少存在一行。每行数据都与请求程序执行的一些数字运算的客户端有关。该程序只能连续执行此数字运算(即,一次针对一个客户端,而不是并行的多个客户端)。
因此,需要通知程序数据库中的数据何时可供其处理。我也可以
- 让程序轮询数据库,或者
- 让数据库触发程序。
问题 1:是否有任何传统观点可以解释为什么一种方法可能比另一种更好?
问题 2:我想知道程序一次“运行”几个月是否有任何问题(服务器中的任何进程是否会停止或中断程序运行?——如果是这样,我不知道我该如何学习有一个问题,除非来自愤怒的客户)。任何人都有在服务器上长时间运行程序而没有问题的经验吗?或者,如果服务器确实崩溃了,有没有办法在服务器重新启动后在其上自动启动一个(即 C 语言可执行文件)程序,从而不需要人专门启动它?
感谢任何建议。
更新 1:客户正在等待结果,但几秒钟的额外延迟(来自轮询)不会破坏交易。
最佳答案
我想给出一个更通用的答案...
没有每次都适用的正确答案。有时您需要触发器,而有时轮询更好。
但是……10 次中有 9 次,轮询比触发更有效、更安全且更快。
其实很简单。触发器需要为每次拍摄实例化一个程序,无论其性质如何。这在大多数时候效率不高。有些人会争辩说,当响应时间是一个因素时,这是必需的,但即便如此,一半的时间轮询更好,因为:
1) 资源:使用触发器,比如 100 条消息,您将需要 100 个线程的资源,如果 1 个线程处理 100 条消息的数据包,您需要 1 个程序的资源。
2) 监控:处理数据包的线程可以报告在定义的数据包大小上不断消耗的时间,清楚地表明它的执行情况以及性能何时以及如何受到影响。尝试使用十亿个触发器跳来跳去......
3) 速度:实例化线程和分配它们的资源是非常昂贵的。如果您要为每个触发器打开一个事务,请不要让我开始。一个处理 100 个消息包的简单程序总是比启动 100 个触发器快得多……
3) react 时间:通过轮询,您无法对在线事物使用react。因此,唯一允许使用轮询的异常(exception)是当用户正在等待消息被处理时。但是你需要非常小心,因为如果你有很多客户端同时做同样的事情,触发可能会比你在进行快速轮询时更晚响应。
我的 2 克拉。这是通过艰难的方式学到的..
关于database - 轮询数据库还是从数据库触发程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9710910/