Повторите попытку подключения JDBC в Java - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь использовать логику повторных попыток для получения соединения JDBC в случае, если я получаю исключение SQL с чем-то вроде:

    int counter = 0;
Connection conn = null;
    while (null == conn) {
      try {
        conn = GetConnectionObject;

      } catch (SQLException e) {
        if (++counter > MAX_RETRY) {
          //Log ERROR
          break;
        }
      } finally {
        if (null != conn) {
          try {
            DbUtils.close(conn);
          } catch (SQLException e) {
            logger.error("Exception while closing the connection object");
          }
        }
      }
    }

В настоящее время я не могу проверить это, поэтому мне нужна помощь.

Это будет работать нормально, если я получу исключение, а затем я могу войти после повторной попытки.Но если мы НЕ получим исключение, оно придет к блоку finally и закроет соединение.Try-Catch-Наконец-то внутри цикла while.

Так что, если я закрою соединение, поток если достигнет

while (null == conn)

Будет ли мой объект соединения станет пустым после закрытия?

Или, если есть какой-то другой способ реализовать часть повторения?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Вот проверенный метод для вашей проблемы.Этот метод пытается установить соединение 3 раза, и когда он установит соединение с БД, он напечатает сообщение об успешном завершении, запустит запрос и отобразит результат, в противном случае он напечатает сообщение об ошибке.Также, если соединение установлено успешно, оно закроет соединение после выполнения запроса в блоке finally.

public void retryDBConnection(){
int counter = 0;
        Connection con = null;
        while(counter < 3 && con == null){
        try{
            String str = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
            Class.forName(str).newInstance();
            con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;Database=TestDB;", "sa", "sqldb");
            System.out.println("DB Connection Successful!");
            PreparedStatement prep = con.prepareStatement("select ID, User_Name from tblUser where ID = 9");
            ResultSet rs = prep.executeQuery();
            if(rs.next()){
                System.out.println("User ID = " + rs.getString(1));
                //name = rs.getString(2);
            }
        }
        catch(SQLException e){
//          System.out.println(e.getSQLState());
            if(e.getErrorCode() == 0 || e.getErrorCode() == 4060)
            counter++;
            System.out.println("Attempt: " + counter +", Could not establish DB Connection!");
            System.out.println("Error Code: " + e.getErrorCode());

        }
    catch(Exception e){
        e.printStackTrace();
    }finally{
        if(con != null){
            try {
                con.close();
                System.out.println("Connection closed...");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    }

}

Вот результат метода.

Попытка: 1, не удалось установить соединение с БД!Код ошибки: 0 Попытка: 2, не удалось установить соединение с БД!Код ошибки: 4060 Соединение с БД успешно!Идентификатор пользователя = 9 Соединение закрыто ...

0 голосов
/ 17 октября 2018

Нет, он не станет нулевым после закрытия.Используйте Connection.isClosed () вместо while( null== conn).Кроме того, вы должны извлечь //Do some task. из этого кода, поскольку его цель - установить соединение JDBC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...