java - 一定数量的查询后 HikariCP 连接超时错误

标签 java mysql jdbc memory-leaks 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)

我已经尝试更改最大池大小最小空闲,并且我还启用了泄漏检测(在 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 使用率也很好,我的互联网连接也很好。查询都工作得很好,除了在几次之后才开始抛出这个错误。

最佳答案

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

你当然是。在您的示例中,您从 DataSource 中获取一个 Connection,执行一个 PreparedStatement,关闭 PreparedStatement 然后不要不要关闭 Connection,因此它不会返回到池中并导致泄漏。

关闭你的人脉!只有您可以防止 fores...err,连接泄漏。

关于java - 一定数量的查询后 HikariCP 连接超时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42006195/

相关文章:

php - 如何在 MySQL 中存储数据的 php 表单中保留 HTML 样式?

mysql - 将 SQL 连接查询转换为 Django ORM

c# - 从 Java 到 C# 验证(匹配) token

java - String s ="abc"+"xyz"中会创建多少个String对象;在 Java 1.5 的早期版本中?

php - 如何从克隆的 laravel 项目生成迁移(表?)到本地数据库?

java - 创建 JDBC 连接时的行业标准是什么?

java - 将字节数组写入oracle中的原始列

java - 如何在 android 中没有更新值的情况下只获取加速度计 X、Y、Z 值?

java - 从可绘制图像到数据库

java - 了解仅前向结果集