1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

HikariCP для чего?

Тема в разделе "Оффтопик", создана пользователем Kurumi, 28 янв 2022.

  1. Автор темы
    Kurumi

    Kurumi Активный участник Пользователь

    Баллы:
    76
    Не знаю, в том ли я разделе создал данную тему.

    Когда я начинал кодить под mysql в интернете многие советовали использовать данную библиотеку. Прислушавшись к умным людям я стал её использовать во всех своих проектах, где нужна связь с бд.

    1) Моя проблема в том, что я не понимаю, на кой хер использовать эту библиотеку, что она мне дает? Я читал простыню текста на гитхабе этой библы и все равно не догоняю... Ну пул соединений и что? Я как-то далёк от всей этой темы. Для меня основными моментами является то, что я просто и легко могу делать crud операции из кода, создавая конекшены и препаред статменты затем закрывая их в finally блоке. Но все это можно делать и без хикари... Так на кой ляд он сдался всем тем разрабам, что советуют его к использованию каждому бродяге в интернете?

    2) На сколько мне известно, Connection и PreparedStatemnt реализуют AutoCloseable. Как я понял, это означает, что соединения и препаред статменты должны закрываться после блока try-with-resources автоматически. Я решил проверить это и понял, что нихера оно само не закрывается, если это все дело не закрывать самому в finally блоке. Отсюда возникает мой второй вопрос: на кой хер эти два класса реализуют этот авто клосейбл и почему тогда он вообще существует? Скорее всего проблема в моих знаниях (ну или их отсутствии).
    Код:
     public void doThis() {
            Connection connection = null;
            try {
                connection = getDataSource().getConnection();
                System.out.println("closed: " + connection.isClosed()); //вывело false
                ResultSet set = getDataSource().getConnection().prepareStatement("SELECT * FROM test").executeQuery();
                System.out.println(set);
                System.out.println("closed: " + connection.isClosed()); //вывело false
            }  catch (SQLException e) {
                e.printStackTrace();
            }
            Connection finalConnection = connection;
            Bukkit.getScheduler().runTaskLater(plugin, () -> {
                try {
                    System.out.println("closed after 5 sec: " + finalConnection.isClosed()); //опять почему-то вывело false
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }, 100L);
        }

    Люди которые собаку съели на всей этой теме разъясните мне пожалуйста эти два момента, буду очень вам благодарен
     
  2. ventureo

    ventureo Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    Cabopust
    Не спец, но по-моему её юзают тупо потому что она быстрее.
     
  3. Автор темы
    Kurumi

    Kurumi Активный участник Пользователь

    Баллы:
    76
    Быстрее что?
     
  4. MurlikMurlik

    MurlikMurlik Активный участник Пользователь

    Баллы:
    96
    Быстрее дефолтной реализации от java. Тут надо гуглить и по сути если это не критичное приложение, то без разницы какой использовать.

    В твоем примере и не используется try-with-resources.

    В конструкцию try надо добавить объект реализующий AutoCloseable. Например так:
    try (Connection сonnection = getDataSource().getConnection()) {
    //здесь работа с соединением

    //Не забывай что статменты тоже надо закрывать.
    try (Statement stmt = connection.createStatement()) {
    //Работа с запросом
    }
    }

    (catch блок добавлять не обязательно если ты не собираешься ловить исключения прямо сейчас)
     
  5. deadanykey

    deadanykey Активный участник Пользователь

    Баллы:
    96
    Как по мне, чересчур распиаренная и переоценённая либа.
    И, по моему мнению, в условиях серверов майна она совершенно не нужна.
     
  6. Автор темы
    Kurumi

    Kurumi Активный участник Пользователь

    Баллы:
    76
    На гите у хикари приложены какие-то тесты, где их либа выигрывает какие-то миллисекунды (и то, я так и не понял где). Суть в том, что я так и не понял, что я по сути беру от хикари? Там я как обычно настраиваю соединение с помощью пропертисов и от hikariDataSource тыркаю connection - дефолтный java класс. Так зачем нужен был этот посредник - hikari?

    Спасибо, тут я действительно не разобрался. Попробую.
     
  7. Автор темы
    Kurumi

    Kurumi Активный участник Пользователь

    Баллы:
    76
    Мне почему-то тоже так кажется, хотя я не очень технически грамотен чтобы утверждать это на все сто процентов. Поэтому и обращаюсь к более опытным коллегам здесь
     
  8. MurlikMurlik

    MurlikMurlik Активный участник Пользователь

    Баллы:
    96
    Только для одной цели - выиграть несколько миллисекунд процессорного времени при обработке запросов к бд.
    Для плагинов и низко загруженных серверов эта либа не нужна.
     
  9. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Задача пула -- держать постоянно открытые соединения до БД.

    Если вы создаёте новый Connection у драйвера БД -- создаётся новое сетевое соединение. Сам факт его установки несколько затратен, потому что нужно несколько сетевых пакетов отправить туда-сюда.

    HikariCP держит в фоне открытые соединения, и фактически создание нового подключения для потребителя выливается просто в получение уже имеющегося соединения из пула, а его закрытие -- только лишь освобождение потребителем и возврат в пул.

    [​IMG]
    (из интернетов)

    Необходимость выливается из требований. Когда нужно делать много запросов или нужно минимальное время выполнения, то использование пула объективно полезно.
    Плюс нужно помнить и о том, что меньше соединений = лучше для самого СУБД.
     
  10. Автор темы
    Kurumi

    Kurumi Активный участник Пользователь

    Баллы:
    76
    А держать соединение весь жизненный цикл программы разве не затратно? Типа, в пуле, как я понимаю, хранится уже несколько открытых соединений. А если таких плагинов, допустим, штук десять и каждый их них хранит в пуле по 8 (дефолтное значение хикари) соединений? Разве это не намного затратнее, нежели открытие конекта тогда, когда это нужно?
     
  11. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Затратно. Но если у тебя постоянно что-то долбится в базу, то накладные расходы на переоткртие соединений будут больше чем расходы на постоянно открытые. Но так-то hikaricp может долго неактивные соединения сам закрывать и открывать когда понадобятся, потому не использовать пул имеет смысл буквально в случаях когда у тебя запрос раз в минуту и всё.
     

Поделиться этой страницей