database - 轮询数据库还是从数据库触发程序?

标签 database oracle

我有一个过程,其中运行在应用程序服务器中的程序必须访问 Oracle 数据库服务器中的表,只要该表中至少存在一行。每行数据都与请求程序执行的一些数字运算的客户端有关。该程序只能连续执行此数字运算(即,一次针对一个客户端,而不是并行的多个客户端)。

因此,需要通知程序数据库中的数据何时可供其处理。我也可以

  1. 让程序轮询数据库,或者
  2. 让数据库触发程序。

问题 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/

相关文章:

oracle - 如何查看并终止对 ORACLE 模式进行的 session 列表?

android - 为数据库处理创建数据模型类

android - 什么是最好的 : 1 table per record or 1 table with all records linked with foreign keys?

mysql - 获取用户名的有效方法

SQL - 将两个表的内容合并到一个表/ View 中

mysql - 使用给定的非常规范化的表编写查询 - 在采访中被问及

mysql - 无法在 Rails 中执行任何数据库命令。 mysql 和 mysql2

sql - 使用 SQL 查询替换 JSON 中的数据

javascript - Oracle XE 10 sc_core.js :472 Uncaught ReferenceError: $x is not defined

sql - 列数