我有一个托管 Oracle 11.2 数据库的 Linux CentOS 服务器,该服务器与应用服务器通信,应用服务器与客户端(Flex 应用程序)通信。我将尝试将我想要实现的伪代码描述为一个过程,如下所示:
应用程序服务器有一个 Java 程序,它充当客户端的数据库前端。基本上,客户端希望进行一些数字运算,向 Java 层提交一些数据,Java 层将这些数据以及用于指示 C 程序数据正在等待的标志一起保存到数据库中。
应用服务器上也有这个 C 程序。C 程序每 1 秒左右轮询一次数据库以获取该标志,当 C 程序检测到该标志被设置时,C 程序使用 OCILIB(例如 OCI)从数据库中下载数据,进行数学运算,并保存一个结果返回到数据库中。然后,C 程序设置一个不同的标志来指示 Java 层完成此处理。
Java 层中的另一个程序正在监视 C 程序将设置的这个标志。当它检测到标志被设置时,Java 层会向客户端发送一条消息,告诉客户端数据在数据库中可用。
然后,客户端通过向上述第一个 Java 程序发送适当的请求,从数据库下载数据。
[一种更简单的方法可能是让 java 层直接调用 C 程序(以避免所有这些轮询数据库等),但是所需的 JNI 编程以及 java 排队和多线程超出了我作为程序员的能力.]
问题:
有 2 个进程轮询数据库在行业中是否相当普遍(无需担心),还是一种不好的做法?
例如(在 SQL 或 PL/SQL 中),当单元格的内容更改为某个值(例如 0 = 等待, 1 = 调用函数)?
上面的简单化方法是合理的还是有缺陷的?有没有更好的方法,虽然仍然很简单,可以达到同样的结果?有什么要注意的吗?
如果您必须进行投票,请参阅我的一位前同事撰写的这篇文章。
我工作过的大多数地方都有从数据库表中获取新行或更改行的某种要求。直到最近我才发现,我认为是一种干净的方式来做到这一点。
他对捕获更改流特别感兴趣,但您的用例听起来像是您想通过数据库执行一种跨语言IPC。我个人不喜欢投票;它不优雅。有几种方法可以解决这个问题:
AQ。我链接到 9i 文档,因此您可以看到这是 Oracle 的一个完善的功能。对于这种应用程序,这是我自己最喜欢的技术。关于 AQ 的一件有趣的事情是,您甚至可能不需要告诉您的应用程序唤醒并获取数据;您可以在有效载荷中发送数据!
数据中心。这在 OCI 中使用起来非常简单,但我从未在 Java 中尝试过,因此无法发表评论。
直接调用从PL / SQL转换为C使用EXTPROC。您可以从 C 调用任何其他语言,包括 Java。从那个链接,Github 上有一些示例代码用于执行此操作;它实际上很简单。
如果你想变得真正具有异国情调,你可以使用Oracle Coherence来做到这一点——我在我的例子中通过C 来做到这一点,还有一个 Java 绑定。
查看DBMS_ALERT 包。
DBMS_ALERT 支持数据库事件(警报)的异步通知。通过适当使用此包和数据库触发器,应用程序可以在数据库中感兴趣的值发生更改时通知自己。
假设图形工具正在显示数据库表中某些数据的图表。图形工具可以在读取数据并绘制图表后,等待涵盖刚刚读取的数据的数据库警报(WAITONE)。当任何其他用户更改数据时,该工具会自动唤醒。所需要的只是将触发器放置在数据库表上,每当触发触发器时,数据库表就会执行信号 (SIGNAL)。
如果必须进行轮询,则应该对正在轮询的字段建立索引,并确保除了应选取的值之外的所有值均为 NULL。这将产生非常小的索引和非常有效的查找。如果多个条件确定何时应处理记录,请考虑创建一个基于函数的索引,该索引对于任何不感兴趣的记录返回 NULL。
归档时间: |
|
查看次数: |
9896 次 |
最近记录: |