Пулы соединений с HikariCP
Эффективно используйте соединения повторно
«Пулы соединений с HikariCP» — бесплатный урок Java Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Зачем нужен пул соединений
Открытие соединения с базой данных — дорогостоящая операция: TCP-рукопожатие, аутентификация и настройка сеанса могут занимать десятки миллисекунд.
Пул соединений поддерживает набор уже открытых соединений. Ваш код получает одно из них, использует его и возвращает обратно, превращая дорогостоящее открытие в быстрое получение готового соединения.
Знакомство с HikariCP
HikariCP — фактический стандартный пул для Java. Он небольшой, быстрый и используется по умолчанию в Spring Boot.
Он реализует javax.sql.DataSource, поэтому остальной код работы с базой данных JDBC остаётся прежним — Вы просто получаете соединения из пула, а не через DriverManager.
Настройка пула
HikariCP настраивается с помощью объекта HikariConfig: в нём задаются URL JDBC, учётные данные и размер пула.
Затем из него создаётся HikariDataSource. Обычно это выполняется один раз при запуске приложения, после чего источник используется совместно.
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
public class Main {
public static void main(String[] args) {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:postgresql://localhost:5432/shop");
config.setUsername("app");
config.setPassword("secret");
config.setMaximumPoolSize(10);
HikariDataSource ds = new HikariDataSource(config);
System.out.println("Pool ready, max size " + config.getMaximumPoolSize());
ds.close();
}
}Получение соединения
Вызовите ds.getConnection(), чтобы получить соединение из пула. Как обычно, оберните его в конструкцию автоматического управления ресурсами.
Главная мысль такова: закрытие соединения из пула не закрывает физический сокет — соединение возвращается в пул для повторного использования.
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
public class Main {
public static void main(String[] args) {
DataSource ds = new HikariDataSource();
try (Connection conn = ds.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT count(*) FROM users");
ResultSet rs = ps.executeQuery()) {
if (rs.next()) System.out.println("Users: " + rs.getInt(1));
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
}close() означает возврат
Это часто сбивает разработчиков. При использовании пула:
conn.close()возвращает соединение в пул.- Пул оставляет настоящий сокет открытым для следующего пользователя.
Поэтому всё равно всегда закрывайте соединение — конструкция автоматического управления ресурсами подходит именно для этого. Вы возвращаете соединение, а не уничтожаете его.
Размер пула
Больше — не значит лучше. Слишком большой пул перегружает базу данных параллельной работой.
Рекомендация HikariCP такова: небольшой пул, часто примерно (core_count * 2) + effective_spindle_count, обычно эффективнее огромного. maximumPoolSize задаёт верхний предел, а minimumIdle поддерживает несколько заранее подготовленных соединений.
public class Main {
public static void main(String[] args) {
int cores = 4;
int spindles = 1; // SSD-ish
int recommended = (cores * 2) + spindles;
System.out.println("Suggested max pool size: " + recommended);
}
}Основные ограничения времени
HikariCP предоставляет ограничения времени, которые защищают приложение от зависшей базы данных:
connectionTimeout— сколько времени ожидать получения соединения до сбоя (по умолчанию 30 с).idleTimeout— как долго существует неиспользуемое соединение.maxLifetime— после какого времени соединение нужно вывести из эксплуатации (это значение должно быть меньше собственного ограничения времени базы данных).
Проверка соединений
Сеть может незаметно разорвать соединения. Перед выдачей соединения HikariCP может проверить его работоспособность.
Современные драйверы JDBC используют Connection.isValid(timeout); HikariCP вызывает этот метод автоматически. Для старых драйверов, в которых нет isValid, можно также задать connectionTestQuery.
Обнаружение утечек
Утечка соединения происходит, когда код получает соединение, но никогда его не закрывает. В конце концов пул исчерпывается, и каждое получение соединения завершается по истечении времени ожидания.
Задайте leakDetectionThreshold (например, 20 000 мс), и HikariCP запишет в журнал трассировку стека для любого соединения, удерживаемого дольше указанного времени, указав непосредственно на проблемный код.
Один пул на приложение
Создайте HikariDataSource один раз и используйте его повторно на протяжении всего времени работы приложения.
Создание нового пула для каждого запроса лишает эту возможность смысла: каждый раз придётся платить за запуск. Закрывайте пул только при завершении работы приложения с помощью ds.close().
Мониторинг пула
HikariCP предоставляет показатели во время работы, чтобы Вы могли следить за состоянием пула.
- Активные, простаивающие и все соединения.
- Потоки, которые в данный момент ожидают соединение.
Он интегрируется с Micrometer, Dropwizard Metrics и JMX. Постоянно большое число ожидающих потоков означает, что пул слишком мал или соединения удерживаются слишком долго.
Быстрая проверка
Что происходит при вызове close() для полученного из пула соединения?
Итоги
HikariCP делает повторное использование соединений эффективным:
- Настройте
HikariDataSourceодин раз при запуске. - Получайте соединение с помощью
getConnection()в конструкции автоматического управления ресурсами;close()возвращает его в пул. - Поддерживайте умеренное значение
maximumPoolSize. - Настройте
connectionTimeout,maxLifetimeи проверку соединений. - Используйте
leakDetectionThreshold, чтобы обнаруживать соединения, не возвращённые в пул.
Часто задаваемые вопросы
Урок «Пулы соединений с HikariCP» бесплатный?
Да — полный текст урока «Пулы соединений с HikariCP» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Пулы соединений с HikariCP»?
Эффективно используйте соединения повторно Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Пулы соединений с HikariCP»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы JDBC
- PreparedStatement
- Транзакции
- Пулы соединений с HikariCP