在开始之前,我想说我已经检查了以下内容,但他们没有帮助我:

  • HikariCP connection error
  • HikariCP - connection is not available
  • https://github.com/brettwooldridge/HikariCP/issues/104

  • 本质上,我正在获取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 sizeminimum idle,并且还启用了leak detection(2秒)。这些都无济于事,除了每次执行查询时都会进行泄漏检测,所以也许与此有关。

    这是我当前的配置:
        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();
    

    我应该在此之后关闭连接吗?我能想象的唯一可能导致错误的是内存泄漏,而且我认为我没有任何泄漏。我的CPU使用率也很好,我的互联网连接也很好。除了几次之后才开始抛出此错误,所有查询都工作正常。

    最佳答案

    “每次执行查询时都会检测到泄漏”。

    当然可以在您的示例中,您从Connection中获取了DataSource,执行了PreparedStatement,关闭了PreparedStatement,然后不关闭了Connection,因此它没有返回到池中并导致泄漏。

    关闭您的人脉!只有您才能防止错误,连接泄漏。

    10-08 16:12