我正在使用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;
}
JdbcTemplate应该关闭连接和免费资源。一个查询不应该使用20个连接!这些连接在查询后很久就会存在。这是我的JdbcTemplate和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
知道可能导致此连接泄漏的原因是什么?
答案 0 :(得分:0)
发现问题所在。上面的查询不是导致连接泄漏的原因。它是对单独方法的单独AJAX调用,该方法在与上述查询相同的时间范围内执行。上面的查询/方法毕竟没有引起任何问题。