当前位置: 首页 > 知识库问答 >
问题:

令人费解的连接泄漏崩溃webapp

林华皓
2023-03-14

我正在使用Java库C3PO实现与MySQL数据库的连接池。我正在记录查询前后的连接,以识别连接泄漏。我发现一个查询使用了将近20个连接,而实际上,当我检查MySQL进程列表时,它创建了50个新进程。这会导致整个webapp失败,因为后端无法再连接到数据库。

下面是导致泄漏的方法的一些伪代码。

public List<Interaction> getInteractions() {
     // Log the # of connections before the query
     logNumConnections();
     --> stdout: Total (7) Idle: (2) Busy: (5) Orphan: (0)

     // Here's the query that's causing the leak
     String sql="select distinct ... from A left join B on A.x=B.y "
            + "where A.x in (?,?,...)"
     List<Interaction> results = jdbcTemplate.query(sql, args, rowMapper);

     // Log the # connections after the query
     logNumConnections();
     --> stdout: Total (24) Idle: (0) Busy: (24) Orphan: (0)

     return results;
}

JdbcTemboard应该关闭连接并释放资源。它不应该为一个查询使用20个连接!这些连接在查询后很长时间都会存在。这是我的JdbcTemboard和DataSource的配置。

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
     <property name="driverClass" value="${database.driver}" />
     <property name="jdbcUrl" value="${database.url}"/>
     <property name="user" value="${database.username}"/>
     <property name="password" value="${database.password}"/>
     <property name="initialPoolSize" value="5" />
     <property name="minPoolSize" value="5" />
     <property name="maxPoolSize" value="50" />
     <property name="acquireIncrement" value="1" />
     <property name="maxStatements" value="1000" />
     <property name="maxStatementsPerConnection" value="1000"/>
     <property name="maxIdleTime" value="10000"/>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
     <constructor-arg>
          <ref bean="dataSource" />
     </constructor-arg>
</bean>

最后,这里是explain语句

id|select_type|table|type  |possible_keys|key    |key_len|rows  | Extra  
 1|SIMPLE     |A    |ALL   |NULL         |NULL   |NULL   |437750| Using where; Using temporary
 1|SIMPLE     |B    |eq_ref|PRIMARY      |PRIMARY|4      |1  

知道是什么导致了这个连接泄漏吗?

共有1个答案

滕英奕
2023-03-14

发现问题。导致连接泄漏的不是上面的查询。这是对单独方法的单独AJAX调用,该方法与上述查询在同一时间段内执行。上面的查询/方法毕竟没有引起任何问题。

 类似资料:
  • 我正在开发一个在Java服务器上运行的游戏。对于数据库池,我使用的是HikariCP,这是一个优秀的库,但它现在抛出了以下错误: 现在我知道连接泄漏意味着打开的连接在某个地方漂浮,但我不知道如何或在哪里漂浮。 下面是我的数据库类中的一个方法,根据堆栈跟踪,错误应该发生在这里。 这只是启动语句的一个基本方法。调用它时,我使用它,然后调用、和 但它告诉我连接是打开的。 我怎么解决这个?谢了!

  • 我有一个mqtt客户端从主题获得请求订阅,然后我把它给固定大小的线程池50。我使用hikaricp 2.4.2为数据库池MySQL数据库。 Im目前使用2.4.2,这是我的设置 以下是完整的日志信息: 警告日志: 811439[Hikari管家(池HikariPool-0)]警告。扎克瑟。希卡里。水塘ProxyLeakTask-已为连接com触发连接泄漏检测。mysql。jdbc。JDBC4Con

  • 我有一个带有和对象的。每次调用,我都会执行以下操作: 我不关闭,因为没有关闭方法。每次调用servlet时,mongo中使用的连接数都会增加: 什么是与mongo和morphia建立联系的正确方式?这种联系到底在哪里?谢谢

  • 我正在Scala应用程序中使用Apache Http客户端。 该应用程序具有相当高的吞吐量和高并行性。 我不确定,但我想我可能是在泄露连接。似乎每当使用客户机的代码部分变得繁忙时,应用程序就会失去响应。我的怀疑是,我正在泄漏套接字或其他东西,从而导致应用程序的其他方面停止工作。与其说是连接泄漏,还不如说是关闭速度不够快。 对于更多上下文,有时,某些操作会导致此代码每分钟并行执行数百次。当这种情况发

  • 我在webapp(hibernate-core-4.3.8。Final和Spring 3.2.11。RELEASE)上使用Spring和hibernate。我使用hikaricp(v 2.2.5)作为连接池impl,它检测连接泄漏并打印下面的stacktrac。我使用Spring的声明性事务划分,因此我假设资源的管理和清理是由Spring/hibernate完成的。因此,我认为Spring或hib

  • 前几天收到FUNPLUS笔试邀请,今天19点进行线上笔试。要开启摄像头和麦克风,笔试不能迟到超过15分钟,十道题一小时。 我本来想着这题量,睡一会儿都能做完,结果我错了。 18:55准备好设备打开笔试链接,页面上5分钟倒计时,不到点不能进入。 19:00点击进入,一直爱的魔力转圈圈。 19:15继续转圈圈(进入加载页面就不算迟到) 中途切wifi连接、换浏览器,都没用,而且提示中途离开两次。 19