java - 从 Oracle DB 到 JMS 的异步调用

标签 java oracle asynchronous jms weblogic

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

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

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

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

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

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

您有什么建议?预先感谢您。

最佳答案

如果存储过程无法优化,那么我就简单地延长超时时间。我认为对于特定任务,JMS 上的超时可以通过某些 Java 注释来覆盖。因此您甚至不必修改全局 Weblogic 设置。

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

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

关于java - 从 Oracle DB 到 JMS 的异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30344450/

相关文章:

Java 泛型帮助

Oracle:我的表什么时候被修改?

sql - 如何使用 regexp_substr 修剪和忽略破折号

Node.js Redis 异步问题

listview - 如何在 Flutter 中构建动态列表?

java - 什么是 WEKA 中的集群评估?

java - 如何在java中异步解析HTTP(也许是http客户端)

java - 无法创建外键

java - 如何在运行时以编程方式更改默认服务器 Play + Ebean

Node.js 以异步模式将值传递给变量