Ошибка тайм-аута соединения HikariCP после определенного количества запросов

прежде чем я начну, я хотел бы сказать, что я проверил следующее, и они мне не помогли:

по сути, я получаю hikaricp stracktrace, и я не знаю, что его вызывает.

java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:548)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:186)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:145)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:83)
at de.arraying.Arraybot.managers.ManagerSync.addCustomCommand(ManagerSync.java:192)
at de.arraying.Arraybot.commands.CommandsCommand.onCommand(CommandsCommand.java:100)
at de.arraying.Arraybot.commands.Command.execute(Command.java:72)
at de.arraying.Arraybot.listeners.ListenerChat.onGuildMessageReceived(ListenerChat.java:68)
at net.dv8tion.jda.core.hooks.ListenerAdapter.onEvent(ListenerAdapter.java:299)
at net.dv8tion.jda.core.hooks.InterfacedEventManager.handle(InterfacedEventManager.java:64)
at net.dv8tion.jda.core.handle.MessageCreateHandler.handleDefaultMessage(MessageCreateHandler.java:97)
at net.dv8tion.jda.core.handle.MessageCreateHandler.handleInternally(MessageCreateHandler.java:47)
at net.dv8tion.jda.core.handle.SocketHandler.handle(SocketHandler.java:38)
at net.dv8tion.jda.core.requests.WebSocketClient.handleEvent(WebSocketClient.java:688)
at net.dv8tion.jda.core.requests.WebSocketClient.onTextMessage(WebSocketClient.java:437)
at com.neovisionaries.ws.client.ListenerManager.callOnTextMessage(ListenerManager.java:352)
at com.neovisionaries.ws.client.ReadingThread.callOnTextMessage(ReadingThread.java:262)
at com.neovisionaries.ws.client.ReadingThread.callOnTextMessage(ReadingThread.java:240)
at com.neovisionaries.ws.client.ReadingThread.handleTextFrame(ReadingThread.java:965)
at com.neovisionaries.ws.client.ReadingThread.handleFrame(ReadingThread.java:748)
at com.neovisionaries.ws.client.ReadingThread.main(ReadingThread.java:110)
at com.neovisionaries.ws.client.ReadingThread.run(ReadingThread.java:66)

Я пробовал изменить maximum pool size, minimum idle и я также позволил leak detection (at 2s). Ничего из этого не помогло, за исключением того, что я получаю обнаружение утечки каждый раз, когда я выполняю запрос, так что, возможно, это связано с этим.

это моя текущая конфигурация:

    HikariConfig hikariConfig = new HikariConfig();
    hikariConfig.setJdbcUrl("jdbc:mysql://"+url+":3306/"+database+"?useSSL=false");
    hikariConfig.setUsername(username);
    hikariConfig.setPassword(password);
    hikariConfig.setMaximumPoolSize(10);
    hikariConfig.setMinimumIdle(3);
    hikariConfig.setLeakDetectionThreshold(2000);
    dataSource = new HikariDataSource(hikariConfig);

мои методы запроса структурированы следующим образом:

        // inside a try/catch, after some checks that aren't related.
        PreparedStatement preparedStatement =
                dataSource.getConnection().prepareStatement(query);
        preparedStatement.setString(2, id);
        preparedStatement.setString(3, name);
        preparedStatement.setObject(1, value);
        preparedStatement.executeUpdate();
        preparedStatement.close();

Я должен закрыть соединение после этого или что? Единственное, что я могу себе представить, что может вызвать ошибку, - это утечки памяти, и я не думаю, что есть. Мое использование процессора тоже в порядке, и мое подключение к интернету. Запросы все работают отлично, за исключением того, что просто начинают бросать эту ошибку через несколько раз.

1 ответов


"я получаю обнаружение утечки каждый раз, когда я выполняю запрос".

конечно. В вашем примере, вы получаете Connection из DataSource, выполнить PreparedStatement закрыть PreparedStatement тогда не закрыть Connection, поэтому он не возвращается в пул и приводит к утечке.

закройте свои связи люди! Только вы можете предотвратить Форес...ошибаться, утечки соединения.