docs: public synchronized void serverStopping() {
          if (tc.isEntryEnabled())
              Tr.entry(tc, "serverStopping ", new Object[] { this });
  
          _serverStopping = true;
  
          Statement lockingStmt = null;
          String queryString = "";
          ResultSet nonLockingRS = null;
          // Need to establish a reserved connection at this point that can be used in log close processing.
          try {
              _reservedConn = _theDS.getConnection();
  
              // The BPM Test team found a case where this connection could be stale - a failover had been performed but no recovery log
              // work had been done up to the point where the server stopped. So we'll just check that it isn't stale.
              lockingStmt = _reservedConn.createStatement();
              // Use RDBMS SELECT FOR UPDATE to lock table for recovery
              queryString = "SELECT SERVER_NAME" +
                            " FROM " + _recoveryTableName + _logIdentifierString + _recoveryTableNameSuffix +
                            " WHERE RU_ID=" + "-1";
              if (tc.isDebugEnabled())
                  Tr.debug(tc, "Attempt to select the HA LOCKING ROW BUT NOT for UPDATE - " + queryString);
              nonLockingRS = lockingStmt.executeQuery(queryString);
              if (!nonLockingRS.next())
                  if (tc.isDebugEnabled())
                      Tr.debug(tc, "HA Locking row was NOT found");
                  else if (tc.isDebugEnabled())
                      Tr.debug(tc, "HA Locking row was found");
              lockingStmt.close();
              _reservedConn.commit();
          } catch (SQLException sqlex) {
              Throwable theNonTransientException = sqlex;
              Tr.audit(tc, "WTRN0107W: " +
                           "Caught SQLException when server stopping for SQL RecoveryLog " + _logName + " for server " + _serverName + " SQLException: " + sqlex);
              // Should we attempt to reconnect? This method works through the set of SQL exceptions and will
              // return TRUE if we determine that an transient DB error has occurred
              boolean retryBatch = sqlTransientErrorHandlingEnabled && isSQLErrorTransient(sqlex);
              boolean failAndReport = true;
              if (retryBatch) {
                  if (tc.isDebugEnabled())
                      Tr.debug(tc, "Try to reexecute the SQL using connection from DS: " + _theDS);
  
                  // Re-execute the SQL
                  try {
                      // Get a connection to database via its datasource
                      _reservedConn = _theDS.getConnection();
                      lockingStmt = _reservedConn.createStatement();
                      nonLockingRS = lockingStmt.executeQuery(queryString);
                      if (!nonLockingRS.next())
                          if (tc.isDebugEnabled())
                              Tr.debug(tc, "HA Locking row was NOT found");
                          else if (tc.isDebugEnabled())
                              Tr.debug(tc, "HA Locking row was found");
                      lockingStmt.close();
                      _reservedConn.commit();
                      failAndReport = false;
                  } catch (SQLException sqlex2) {
                      // We've caught another SQLException. Assume that we've retried the connection too soon.
                      // Make sure we inspect the latest exception
                      if (tc.isDebugEnabled())
                          Tr.debug(tc, "reset the sqlex to " + sqlex2);
                      theNonTransientException = sqlex2;
                  } catch (Throwable exc) {
                      // Not a SQLException, break out of the loop and report the exception
                      if (tc.isDebugEnabled())
                          Tr.debug(tc, "Failed got exception: " + exc);
  
                      for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
                          if (tc.isDebugEnabled())
                              Tr.debug(tc, " " + ste);
                      }
  
                      theNonTransientException = exc;
                  }
              }
  
              if (failAndReport) {
                  // Throw an FFDC, but allow processing to continue
                  FFDCFilter.processException(theNonTransientException, "com.ibm.ws.recoverylog.spi.SQLMultiScopeRecoveryLog.serverStopping", "464", this);
  
                  _reservedConn = null;
  
                  if (tc.isEntryEnabled())
                      Tr.exit(tc, "serverStopping", theNonTransientException);
              }
          } finally {
              try {
                  if (nonLockingRS != null && !nonLockingRS.isClosed())
                      nonLockingRS.close();
                  if (lockingStmt != null && !lockingStmt.isClosed())
                      lockingStmt.close();
              } catch (SQLException e) {
                  // Log close failure but allow processing to continue
                  if (tc.isDebugEnabled())
                      Tr.debug(tc, "on closing SQL resources caught exception: " + e);
              }
          }
  
          if (tc.isEntryEnabled())
              Tr.exit(tc, "serverStopping");
      }