轮询数据库与从数据库触发程序?

时间:2012-03-14 21:57:45

标签: database oracle

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

因此,程序需要被告知数据库中何时有数据可供处理。我可以

  1. 让程序轮询数据库,或
  2. 让数据库触发程序。
  3. 问题1:有没有传统观点为什么一种方法可能比另一种更好?

    问题2:我想知道程序是否有任何问题“一次运行”几个月(服务器中的任何进程是否会停止或中断程序运行? - 如果是这样我不知道我是如何学习的除非愤怒的顾客,否则有问题)。任何人都有在服务器上运行程序很长时间没有问题的经验?或者,如果服务器崩溃,有没有办法在服务器重新启动后自动启动它(即C语言可执行文件)程序,因此不需要人专门启动它?

    任何建议表示赞赏。

    更新1:客户正在等待结果,但是几秒钟的额外延迟(来自轮询)不是交易破坏者。

5 个答案:

答案 0 :(得分:2)

1)让程序轮询数据库,因为您不希望数据库能够启动主程序(因为您必须确保只有“您的”程序可以以这种方式开始)。

在Oracle中执行此操作的经典(以及最方便的IMO)方式是DBMS_ALERT package

第一个程序会发出一个具有特定名称的警报,并传递一条可选消息。注册警报的第二个程序将在第一个程序提交后立即等待并立即接收。第一个程序的回滚将取消警报。

原因是您可以有许多会话信号并等待警报。但是,警报是序列化设备,因此如果一个程序发出警报信号,则其他发出相同警报名称的程序将被阻止,直到第一个程序提交或回滚为止。

Table DBMS_ALERT_INFO包含已注册警报的所有会话。您可以使用它来检查警报处理是否存活。

2)自动启动或后台执行取决于您的主机平台和操作系统。在Windows中,您可以使用SRVANY.EXE将任何可执行文件作为服务运行。

答案 1 :(得分:1)

我建议使用C程序轮询数据库和monit等实用程序,以便在出现任何问题时重新启动C程序。您的C程序可以偶尔触摸一个文件以指示它仍然正常运行,并且monit可以监视该文件。 Monit还可以直接检查进程并确保它没有使用太多内存。

有关详细信息,您可以看到我对其他问题的回答:

When a new row in database is added, an external command line program must be invoked

或者,如果人们没有等待计算完成,您可以使用 cron作业定期运行C程序(例如每分钟)。然后monit就不那么需要了,因为你的C程序会一直启动和停止。

答案 2 :(得分:1)

您可能需要查看Oracle的“更改通知”:

http://docs.oracle.com/cd/E11882_01/appdev.112/e25518/adfns_cqn.htm

我不知道它与“常规”C程序的集成程度如何。

它也可以通过.Net和Java / JDBC

获得

http://docs.oracle.com/cd/E11882_01/win.112/e23174/featChange.htm
http://docs.oracle.com/cd/E11882_01/java.112/e16548/dbchgnf.htm

答案 3 :(得分:0)

您可以使用简单的作业管理器(如gearman)将作业消息从数据库发送给工作人员。 Gearman还有一个MySQL用户定义的函数接口,因此也很容易为oracle构建一个。

答案 4 :(得分:0)

我想提供一个更通用的答案......

每次都没有正确的答案。有时你需要一个触发器,有时候轮询更好。

但是... 10次中有9次,轮询比触发更有效,更安全且

这很简单。触发器需要为每个镜头实例化任何性质的单个程序。这在大多数时候效率不高。有些人认为,当响应时间是一个因素时,这是必需的,但即便如此,有一半的时间轮询更好,因为:

1)资源:使用触发器,并说100条消息,您将需要100个线程的资源,1个线程处理100个消息的数据包,您需要1个程序的资源。

2)监控:线程处理数据包可以报告在定义的数据包大小上不断消耗的时间,清楚地表明它的执行方式以及性能受影响的时间和方式。尝试用十亿个触发器跳来跳去......

3)速度:实例化线程并分配资源非常昂贵。如果您为每个触发器打开一个事务,请不要让我开始。一个处理说100 meessage数据包的简单程序总是比启动100个触发器快得多......

3)反应时间:通过轮询,您无法对在线事物作出反应。因此,允许使用轮询的唯一例外是用户正在等待处理消息。但是你需要非常小心,因为如果你有很多客户同时做同样的事情,触发可能会比你快速轮询的时间更快回应。

我的2个。这是学得很难的。