在J2EE应用程序中优雅地处理DB节点重启



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

节点1 -每月第一个星期日凌晨1点节点2 -每月第二个星期日上午1时

每当这些节点重新启动时,我在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的回答…我们的应用程序不应该在重启过程中阻塞数据库。

我的问题是,为什么我的应用程序抛出这个异常?为什么我的应用程序试图连接到正在关闭的DB节点?

您的应用程序没有尝试连接到正在关闭的节点。当关机开始时,它已经连接。

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

最有可能的情况是,您希望捕获此错误并重新连接,这将导致与剩余节点建立新的连接。你得到的错误是一个SQLRecoverableException,所以它通常是有意义的尝试恢复。

最新更新