【问题标题】:Can jdbc connections be recovered?可以恢复jdbc连接吗?
【发布时间】:2011-09-14 10:15:01
【问题描述】:

由于数据库不可用而关闭的jdbc连接能否恢复。

为了回馈背景,我依次收到以下错误。它看起来不像是手动重新启动。我的问题的原因是我被告知该应用程序在没有 重新开始。因此,如果连接丢失,是否可以在数据库重新启动后恢复。

java.sql.SQLException: ORA-12537: TNS: 连接关闭

java.sql.SQLRecoverableException: ORA-01034: ORACLE 不可用 ORA-27101: 共享内存领域不存在 IBM AIX RISC System/6000 错误:2:没有这样的文件或目录

java.sql.SQLRecoverableException: ORA-01033: ORACLE 初始化或关机正在进行中

【问题讨论】:

  • 而不是仅仅打开一个新的连接?
  • 您是否在整个应用程序的生命周期内保持连接打开?那很糟。它们应该在尽可能短的范围内打开和关闭,最好在您执行 SQL 查询的同一方法块内。
  • 不,事实并非如此,它们正在被关闭,而我确实使用了连接池。我在日志中发现了异常,并试图破译可能发生的事情。请记住,该应用程序之后运行良好。希望这可以澄清。
  • 也许您的连接池没有正确配置来测试借用连接和删除废弃连接?例如,糟糕的 DBCP 池默认情况下不会这样做。您可能希望在问题中添加有关使用的连接池及其配置的更多详细信息。

标签: database oracle jdbc


【解决方案1】:

没有。连接是“死的”。创建一个新的连接。

一个好的方法是使用connection pool,它会在将连接发送给您之前测试连接是否仍然正常,并在需要时自动创建新连接。

有几个开源连接池可供使用。我用过Apache's JDCP,它对我有用。

已编辑:
鉴于您想等到数据库关闭后恢复(有趣的想法),您可以实现getConnection() 的自定义版本,如果数据库没有响应,则“等待一段时间并重试”。

附言我喜欢这个主意!

【讨论】:

  • 对问题添加了评论
  • 连接池在这里没有帮助;它仅在个别数据库会话崩溃时才有帮助。
【解决方案2】:

连接无法恢复。可以做的是将连接故障转移到另一个数据库实例。 RAC 和数据保护安装支持此配置。

这对于只读事务没有问题。然而,对于执行 DML 的事务来说,这可能是个问题,尤其是在对 DB 的最后一次调用是提交的情况下。在提交的情况下,客户端无法判断提交调用是否完成。数据库何时失败;在执行提交之前,或在执行提交之后(但不将确认发送回客户端)。只有应用程序有这个逻辑并且可以做正确的事情。如果故障转移后的应用程序没有验证最后一个事务的状态,则可能出现重复事务。这是一个已知问题,我们大多数人在购买门票或类似的网络交易时都遇到过。

【讨论】:

    猜你喜欢
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2017-07-13
    • 2014-03-07
    • 2017-12-31
    • 1970-01-01
    相关资源
    最近更新 更多