Подтвердить что ты не робот

Состояние соединения Java JDBC

Я (успешно) подключаюсь к базе данных, используя следующее:

java.sql.Connection connect = DriverManager.getConnection(
  "jdbc:mysql://localhost/some_database?user=some_user&password=some_password");

Что я должен проверять, чтобы узнать, все еще открыта ли связь и через какое-то время?
Я надеялся, что для меня будет доступно что-то вроде connect.isConnected();.

4b9b3361

Ответ 1

Ничего. Просто выполните ваш запрос. Если соединение скончалось, ваш драйвер JDBC снова подключится (если он его поддерживает, и вы включили его в строку подключения, большинство из них не поддерживают его), иначе вы получите исключение.

Если вы проверите соединение, оно может упасть до фактического выполнения вашего запроса, поэтому вы ничего не получите, проверив.

Тем не менее, многие пулы соединений проверяют соединение, выполняя что-то вроде SELECT 1 перед тем, как передать соединения. Но это не что иное, как просто выполнение запроса, поэтому вы можете просто выполнить свой бизнес-запрос.

Ответ 2

Ваш лучший шанс - просто выполнить простой запрос к одной таблице, например:

select 1 from SOME_TABLE;

О, я только что увидел, что есть новый метод, доступный с версии 1.6:

java.sql.Connection.isValid(int timeoutSeconds):

Возвращает true, если соединение не было закрыто и остается в силе. Водитель должен подать запрос на соединение или использовать какой-либо другой механизм, который положительно проверяет соединение, остается в силе, когда этот метод называется. Запрос, предоставленный драйвером для проверки соединение должно выполняться в контексте текущего сделка.

Ответ 3

Используйте функцию Connection.isClosed().

JavaDoc гласит:

Получает, был ли этот объект Connection закрыт. соединение закрывается, если для него был вызван метод close или если произошли некоторые фатальные ошибки. Этот метод гарантированно возвращать true только когда он вызывается после метода Connection.close был вызван.

Ответ 4

Вы также можете использовать

public  boolean isDbConnected(con Connection) {
    //final String CHECK_SQL_QUERY = "SELECT 1";
    try {
        if(!con.isClosed() || con!=null){
            return true;
        }
    } catch (SQLException e) {
        return false;
    }
    return false;
}

Ответ 5

Если вы используете MySQL

public static boolean isDbConnected() {
    final String CHECK_SQL_QUERY = "SELECT 1";
    boolean isConnected = false;
    try {
        final PreparedStatement statement = db.prepareStatement(CHECK_SQL_QUERY);
        isConnected = true;
    } catch (SQLException | NullPointerException e) {
        // handle SQL error here!
    }
    return isConnected;
}

Я не тестировал другие базы данных. Надеюсь, что это будет полезно.

Ответ 6

Недорогой метод, независимо от реализации поставщика, заключается в выборе чего-либо из памяти процесса или памяти сервера, например, версии БД или имени текущей базы данных. IsClosed очень плохо реализован.

Пример:

java.sql.Connection conn = <connect procedure>;
conn.close();
conn.getMetaData();