首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HikariCP连接泄漏

HikariCP连接泄漏
EN

Stack Overflow用户
提问于 2016-08-08 14:33:21
回答 1查看 7.4K关注 0票数 2

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

代码语言:javascript
复制
[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)

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

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

代码语言:javascript
复制
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()

但它还是告诉我连接是打开的。

我该怎么解决这个问题?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2016-08-09 01:50:34

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38831963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档