【问题标题】:Gracefully handling DB Node reboot in J2EE application在 J2EE 应用程序中优雅地处理 DB 节点重启
【发布时间】:2015-08-03 18:04:58
【问题描述】:

在我的组织中,Oracle 数据库是一个 2 节点 RAC 数据库。集群的每个成员都处于重启计划中:

节点 1 - 每个月的第一个星期日凌晨 1:00 节点 2 - 每个月的第二个星期日凌晨 1:00

每当这些节点重新启动时,我都会在我的 J2EE 应用程序日志文件中看到以下异常:

org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:209)
... 154 more
Caused by: java.sql.SQLRecoverableException: ORA-01089: immediate shutdown in progress - no operations are permitted

                    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
                    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:389)
                    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:382)
                    at oracle.jdbc.driver.T4C7Ocommoncall.processError(T4C7Ocommoncall.java:93)
                    at oracle.jdbc.driver.T4CTTIfun.receive

我们的 DBA 说“我们在本地关闭事务。它应该尝试等待飞行中的事务完成并且不允许新事务。

正如我上面提到的,在 2 个节点中,一次只有一个节点会重新启动,并且考虑到 DBA 的回答。我们的应用在重新启动过程中绝不应该阻塞数据库。

我的问题是,为什么我的应用程序会抛出这个异常呢?为什么我的应用程序尝试连接到正在关闭的数据库节点?

【问题讨论】:

    标签: java oracle jakarta-ee database-connection connection-pooling


    【解决方案1】:

    您的应用程序未尝试连接到正在关闭的节点。关机开始时已连接。

    我假设您的应用程序在中间层维护一个连接池。因此,据推测,就在其中一个节点重新启动之前,您的连接池与两个节点都有打开的连接。当 DBA 执行shutdown transactional 时,允许具有活动事务的会话完成,但连接池中连接到正在关闭的节点的大多数会话此时将没有活动事务。当您从连接池中获取其中一个连接并尝试启动事务时,您将收到此错误。

    您很可能希望捕获此错误并重新连接,这应该会导致与剩余节点建立新连接。您收到的错误是SQLRecoverableException,因此尝试恢复通常是有意义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-13
      • 2015-03-16
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 2013-07-21
      • 2022-06-30
      相关资源
      最近更新 更多