在我的组织中,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应答..我们的应用程序在重启过程中永远不应该阻塞数据库。
我的问题是,为什么我的应用程序抛出此异常呢?为什么我的应用程序试图连接到正在关闭的数据库节点?
答案 0 :(得分:3)
您的应用程序未尝试连接到正在关闭的节点。关机开始时它已经连接。
我假设您的应用程序在中间层维护一个连接池。因此,大概在其中一个节点重新启动之前,您的连接池与两个节点都打开了连接。当DBA执行shutdown transactional
时,允许完成具有活动事务的会话,但是连接池中连接到正在关闭的节点的大多数会话在该点都不会有活动事务。当您从连接池中获取其中一个连接并尝试启动事务时,您将收到此错误。
最有可能的是,您希望捕获此错误并重新连接,这应该导致与其余节点建立新连接。您获得的错误是SQLRecoverableException
,因此尝试恢复通常是有意义的。