【问题标题】:Does Oracle keeps query running in the background despite losing connection with the app?尽管与应用程序失去连接,Oracle 是否会在后台保持查询运行?
【发布时间】:2021-07-16 14:55:11
【问题描述】:

我们用 Java 编写的应用通过 JDBC API 向 Oracle 发送长时间运行的查询。不可避免的是,有时应用程序可能会由于多种原因而崩溃或突然被杀死,而没有机会终止它已发送的查询。当应用程序被终止或停止时,它也会失去与 Oracle 的连接。

即使查询已经与发送查询的应用断开连接,Oracle DB 是否仍让查询在后台运行?

请注明出处。

【问题讨论】:

  • 会话应该立即认识到他们已经失去了客户端连接,这应该停止正在运行的任何东西。根据正在运行的内容,回滚挂起的事务或释放临时空间可能需要一些时间。你不应该自己清理任何东西。
  • @Jahan,感谢该链接,第四个要点似乎是最接近的答案。让我花时间阅读更多内容。

标签: java oracle jdbc oracle12c


【解决方案1】:

当数据库和应用程序之间的连接丢失时,Oracle 将停止会话的查询并终止会话。但有两个潜在的例外:

  1. 回滚必须完成。来自Database Concepts manual:“事务结束时......客户端进程异常终止,导致事务使用存储在事务表和撤消段中的元数据隐式回滚。”无论连接发生什么,都无法停止该回滚过程。即使您杀死数据库实例,当实例重新启动时,它也会恢复回滚。作为一般经验法则,回滚时间与数据库运行 DML 所花费的时间大致相同。您只需等待 Oracle 将自身恢复到一致状态即可。
  2. 僵尸会话。虽然我没有针对这个问题的可重现测试用例,但我相信每个 DBA 都有关于在客户端进程消失后运行会话的故事,甚至在他们终止会话之后。在您将此问题视为一个古老的神话之前,请注意 SQLNET.EXPIRE_TIME 参数是为此场景创建的。将该值设置为大于 0 将使 Oracle 定期检查并清除已终止的会话。但除非您遇到特定问题,否则无需设置此参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多