gpt4 book ai didi

java - HikariCP 连接泄漏

转载 作者:行者123 更新时间:2023-11-30 08:34:27 33 4
gpt4 key购买 nike

我正在开发一款在 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)

现在我知道连接泄漏意味着打开的连接在某处 float ,但我无法弄清楚如何或在哪里。

下面是我的数据库类中的一个方法,根据堆栈跟踪应该是错误发生的地方。

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()

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

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

最佳答案

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

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

关于java - HikariCP 连接泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38831963/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com