【问题标题】:Asynchronous call from Oracle DB to JMS从 Oracle DB 到 JMS 的异步调用
【发布时间】:2015-08-01 09:25:03
【问题描述】:

Web 应用程序允许请求大量信息并处理我拥有 JMS 的负载和超时。每次调用数据导出功能时,都会通过 JMS 路由并发布 Web 查询。

之后,JMS 调用 Oracle 存储过程,它需要一段时间 - 5-10 分钟。执行它。我最初的想法是调用是异步的,因为查询被释放了。但是,Weblogic JMS 有 15 秒的数据库连接超时值。因此,在它终止连接之后,因为管道中没有数据(Oracle 存储过程正忙于提取必要的数据)。

到目前为止,我找到了以下解决方案:

  • 增加超时。数据中心的支持人员不太高兴,并指出应用程序设计存在问题。关键是,查询必须在所有层上都是异步的,包括 JMS->Oracle。

  • 将存储过程作为作业并在调用启动后关闭 JMS->Oracle 连接。这种方法的问题是我需要不断地 ping Oracle DB 以了解作业何时完成。

  • 同第二个,但要尝试回调JMS。然而,简短的阅读给我的印象是,这种解决方案不是很受欢迎,因为它不是通用的(硬编码值等)。

您有什么建议?提前谢谢你。

【问题讨论】:

    标签: java oracle asynchronous jms weblogic


    【解决方案1】:

    如果存储过程不能优化,那我就干脆延长超时时间。我认为对于特定任务,JMS 的超时可以被一些 Java 注释覆盖。因此,您甚至不必修改全局 Weblogic 设置。

    您当然有方法可以不合时宜地调用该过程。通过使用 AQ(您是否使用高级队列和 JMS 提供程序)或通过将其作为调度程序作业提交。但是,如果您提交要并行执行的许多作业,则存在可能会杀死数据库的风险。 DBMS_JOB 和(较新的首选)DBMS_SCHEDULER_JOB 都可以限制运行的并发会话数。因此,您将调用另一个包装过程,而不是直接调用存储过程,该过程将提交单次非重复 DBMS_SCHEDURER_JOB。然后调度程序会将您的过程作为调度程序任务执行。但是这个解决方案你必须与你的 DBA 协商。 Oracle中有一个视图,您可以在其中检查状态

    您使用的是 Oracle Advanced Queuing,您还可以将作业提交到 Oracle AQ。然后拥有一个 PL/SQL 存储过程(作为“无限”调度程序作业运行),它将从 AQ 中一一提取消息,并执行所需的存储过程。当程序完成时,它可以将它的响应提交到另一个 AQ。由于 AQ 可以作为 Weblogic 上的 JMS 提供者,您的应用程序将通过 JMS 收到有关过程完成的通知。

    【讨论】:

      猜你喜欢
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 2019-03-20
      • 2015-01-20
      • 1970-01-01
      相关资源
      最近更新 更多