1. Обзор
В этой статье мы обсудим некоторые аспекты состояния соединения JDBC . Во-первых, мы увидим наиболее распространенные причины потери соединения. Затем мы научимся определять статус подключения .
Мы также узнаем , как проверить соединение перед выполнением операторов SQL .
2. JDBC-соединение
Класс Connection
отвечает за связь с источником данных. Связь может быть потеряна по разным причинам:
- Сервер базы данных не работает
- Сетевое подключение
- Повторное использование закрытого соединения
Выполнение любой операции с базой данных при потере соединения приведет к SQLException
. Кроме того, мы можем проверить исключение для получения подробной информации о проблеме.
3. Проверка соединения
Существуют различные способы проверки соединения. Мы рассмотрим эти методы, чтобы решить, когда использовать каждый из них.
3.1. Состояние подключения
Мы можем проверить статус подключения
, используя метод isClosed()
. При использовании этого метода операция SQL не может быть предоставлена. Однако полезно проверить, открыто ли соединение.
Давайте создадим условие состояния перед запуском операторов SQL:
public static void runIfOpened(Connection connection) throws SQLException
{
if (connection != null && !connection.isClosed()) {
// run sql statements
} else {
// handle closed connection path
}
}
3.2. Проверка соединения
Даже если соединение открыто, оно может быть потеряно по причинам, описанным в предыдущем разделе. Поэтому может потребоваться проверка соединения перед выполнением любого оператора SQL .
Начиная с версии 1.6 класс
Connection
предоставляет метод проверки. Во-первых, он отправляет проверочный запрос в базу данных. Во-вторых, он использует параметр тайм
-аута в качестве порога для операции. Наконец, соединение помечается как действительное, если операция завершается успешно в течение тайм- аута
.
Давайте посмотрим, как проверить соединение перед выполнением любого оператора:
public static void runIfValid(Connection connection)
throws SQLException
{
if (connection.isValid(5)) {
// run sql statements
}
else {
// handle invalid connection
}
}
В этом случае тайм- аут
составляет 5 секунд. Нулевое значение указывает, что тайм-аут не применяется к проверке. С другой стороны, значение меньше нуля вызовет исключение SQLException
.
3.3. Пользовательская проверка
Есть веские причины для создания собственного метода проверки . Например, мы могли бы использовать устаревший JDBC без метода проверки. Точно так же нашему проекту может потребоваться настраиваемый запрос проверки для запуска перед всеми операторами.
Давайте создадим метод для запуска предопределенного запроса проверки:
public static boolean isConnectionValid(Connection connection)
{
try {
if (connection != null && !connection.isClosed()) {
// Running a simple validation query
connection.prepareStatement("SELECT 1");
return true;
}
}
catch (SQLException e) {
// log some useful data here
}
return false;
}
Во-первых, метод проверяет статус подключения. Во-вторых, он пытается запустить проверочный запрос, возвращая true
в случае успеха. Наконец, он возвращает false
, если запрос проверки не выполняется или завершается ошибкой.
Теперь мы можем использовать пользовательскую проверку перед выполнением любого оператора:
public static void runIfConnectionValid(Connection connection)
{
if (isConnectionValid(connection)) {
// run sql statements
}
else {
// handle invalid connection
}
}
Конечно, выполнение простого запроса — хороший выбор для проверки подключения к базе данных. Однако есть и другие полезные методы в зависимости от целевого драйвера и базы данных :
- Автоматическая фиксация — использование
connection.getAutocommit()
иconnection.setAutocommit()
- Метаданные — с помощью
connection.getMetaData()
4. Пул соединений
Соединения с базой данных являются дорогостоящими с точки зрения ресурсов. Объединение соединений в пул является хорошей стратегией для управления и настройки этих соединений .
Короче говоря, они могут снизить стоимость жизненного цикла соединения.
Все платформы пула соединений Java имеют собственную реализацию проверки соединения. Кроме того, в большинстве из них используется параметризуемый проверочный запрос.
Вот некоторые из самых популярных фреймворков:
- Apache Commons DBCP —
validationQuery, validationQueryTimeout
- Hikari CP —
connectionTestQuery, validationTimeout
- C3P0 —
предпочтительный тестовый запрос
5. Выводы
В этой статье мы рассмотрели основы статуса соединения JDBC. Мы рассмотрели некоторые полезные методы класса Connection
. После этого мы описали некоторые альтернативы для проверки соединений перед выполнением операторов SQL.
Как обычно, все примеры кода, показанные в этой статье, доступны на GitHub .