Будет ли база данных пропускать входящий запрос, поскольку он занят? - PullRequest
2 голосов
/ 30 января 2011

В моем приложении я реализовал метод получения привилегий конкретного пользователя. Если пользователь новый, в таблице не будет записи. Если я добавлю в таблицу favourtis по умолчанию. Код показан ниже.

 public String getUserFavourits(String username) {
 String s = "SELECT FAVOURITS FROM USERFAVOURITS WHERE USERID='" +
        username.trim() + "'";
    String a = "";
    Statement stm = null;
    ResultSet reset = null;
    DatabaseConnectionHandler handler = null;
    Connection conn = null;
    try {
      handler = DatabaseConnectionHandler.getInstance();
      conn = handler.getConnection();
      stm = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
      reset = stm.executeQuery(s);
      if (reset.next()) {
        a = reset.getString("FAVOURITS").toString();
      }
      reset.close();
      stm.close();
    }
    catch (SQLException ex) {
      ex.printStackTrace();
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
    finally {
      try {
        handler.returnConnectionToPool(conn);

        if (stm != null) {
          stm.close();
        }
        if (reset != null) {
          reset.close();
        }
      }catch (Exception ex) {
        ex.printStackTrace();
      }
    }
    if (a.equalsIgnoreCase("")) {
      a = updateNewUserFav(username);
    }
    return a;
  }

Вы можете видеть, что после блока finally используется метод updateNewUserFav (имя пользователя) для вставки предпочтений по умолчанию в таблицу. Обычно пользователи вынуждены изменить это при первом входе в систему. Моя проблема в том, что многие пользователи жаловались мне на то, что они потеряли свои индивидуальные предпочтения и по умолчанию загружаются в их логин. Когда я просматриваю код, я замечаю, что это может произойти, только если в блоке try возникло исключение. Когда я отлаживаю код работает нормально. Это можно использовать в то время, когда БД занята? Обычно в системе более 1000 одновременно работающих пользователей. Поскольку приложение работает в режиме реального времени, в базу данных поступит огромное количество запросов (БД - Oracle).

Может кто-нибудь объяснить, пожалуйста.

1 Ответ

3 голосов
/ 31 января 2011

Во-первых, используйте предложение Джонарла о переменных связывания. Если большая часть вашего кода похожа на это с 1000 одновременно работающих пользователей, я бы не хотел думать, на что похожа производительность.

Во-вторых, если он занят, то есть вероятность тайм-аута. Как вы говорите, если возникает исключение, оно возвращается к «updateNewUserFav»

Действительно, он должен вызывать это только в том случае, если исключение НЕТ. Если возникает исключение, функция должна завершиться ошибкой. Текущий код похож на

"TURN THE IGNITION KEY TO START THE CAR"
"IF THERE IS A PROBLEM, RING GARAGE AND BOOK APPOINTMENT"
"PUT CAR INTO GEAR AND RELEASE HAND_BRAKE"

Вы действительно хотите отпустить ручной тормоз только после успешного запуска автомобиля, в противном случае вы в конечном итоге скатитесь с холма до внезапной остановки в конце (часто с использованием дорогого звука CRUNCH).

...