【问题标题】:HikariCP Connection leakHikariCP 连接泄漏
【发布时间】:2016-08-09 09:50:34
【问题描述】:

我正在开发一个在 Java 服务器上运行的游戏。对于数据库池,我使用的是 HikariCP,它是一个优秀的库,但它现在以我的方式抛出以下错误:

[Hikari housekeeper (pool HikariPool-0)] WARN com.zaxxer.hikari.pool.ProxyLeakTask - Connection leak detection triggered for connection com.mysql.jdbc.JDBC4Connection@5910e440, stack trace follows
java.lang.Exception: Apparent connection leak detected
    at nl.finicky.lemonade.database.Database.prepare(Database.java:43)
    at nl.finicky.lemonade.rooms.RoomFactory.loadRoom(RoomFactory.java:25)
    at nl.finicky.lemonade.rooms.RoomFactory.<init>(RoomFactory.java:20)
    at nl.finicky.lemonade.Lemonade.main(Lemonade.java:30)

现在我知道连接泄漏意味着打开的连接在某处浮动,但我不知道如何或在哪里。

以下是我的数据库类中的一个方法,根据堆栈跟踪应该会出现错误。

public PreparedStatement prepare(String query) {
    PreparedStatement statement = null;

    try {
        while (statement == null) {
            statement = this.dataSource.getConnection().prepareStatement(query, 1); 
// The line triggering the error ^

            if (statement != null) {
                this.databasePool.getStorage();
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        return statement;
    }
}

这只是启动语句的基本方法。当这个被调用时,我使用它然后调用resultSet.close()preparedStatement.getConnection.close()preparedStatement.close()

它仍然告诉我连接已打开。

我该如何解决这个问题?谢谢!

【问题讨论】:

    标签: java database-connection


    【解决方案1】:

    稍后调用preparedStatement.getConnection.close() 只会获得一个不同的连接并关闭它。

    你不能用这种模式做你想做的事情。调用this.dataSource.getConnection().prepareStatement(...) 是从池中获取一个连接并丢弃对它的引用,之后没有人可以关闭它。并且您无法在此方法中关闭 Connection,即使您保留了对它的引用,因为这样返回的 PreparedStatement 将无法使用。

    【讨论】:

      猜你喜欢
      • 2019-01-18
      • 2021-07-30
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2021-09-09
      • 2011-02-18
      • 1970-01-01
      • 2015-12-04
      相关资源
      最近更新 更多