C3PO连接池 - 未释放连接

时间:2014-06-16 09:58:19

标签: java spring connection-pooling

我有一个在Tomcat 7下运行的Web应用程序,使用Spring c3po作为连接池管理器。我还使用了dbcp并得到了相同的结果。

我启动了一个长时间运行的单线程进程,该进程在各种jdbcTemplate.update()中使用dao等进行大量数据库调用。由于每个更新都是简单且独立的,因此不使用任何事务管理器。

出于某种原因,我的连接已经用完了。似乎正在发生的事情是每个dao保持自己的连接而不将其返回到池中。

这是正常行为吗?我曾预料到连接与jdbcTemplate.update()绑定,并在完成后立即释放。

...

在上下文文件中......

<bean id="enquiryDataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${enquiry.drivername}"/>
        <property name="url" value="${enquiry.jdbc}"/>
        <property name="username" value="${enquiry.username}"/>
        <property name="password" value="${enquiry.password}"/>

        <property name="maxWait" value="30000"/>
        <property name="maxActive" value="50"/>
</bean>

在典型的dao构造函数中......

@Autowired
public XXXCountryDao(@Qualifier("enquiryDataSource") DataSource dataSource,
                       @Qualifier("sqlUpdaterFactoryImpl") SqlUpdaterFactory sqlUpdaterFactory, @Qualifier("sqlFormatterFactoryImpl") SqlFormatterFactory sqlFormatterFactory) {

    super("Country", dataSource, sqlUpdaterFactory, sqlFormatterFactory);
    // ...other constructor stuff

}

所有dao都继承自......

public abstract class AbstractFileProcessorDao<ImportRecType, QueryRecType> extends JdbcDaoSupport {

// ...

}

在典型的dao方法中......

protected boolean runUpdateToSqlDatabase(Map<String, Object> values, Map<String, Object> whereValues) {
    if (values.isEmpty())
        return true;

    String sql = updateUpdaterServer.getSql(values, whereValues);

    if (logger.isDebugEnabled())
        logger.debug("Server SQL -> " + sql);

    getJdbcTemplate().update(sql);
    return false;
}

1 个答案:

答案 0 :(得分:1)

请检查您的申请&#34; rogue&#34;调用DataSource#getConnection(您可以使用IDE搜索方法引用)。连接泄漏通常是通过获取连接而导致的,然后通过Connection#close永远不会关闭。

使用Spring的JdbcTemplate时,所有JDBC资源处理(打开/关闭连接,语句,结果集)都会自动完成。但是使用遗留代码你永远不会知道。