Java C3PO连接池-未释放连接

Java C3PO连接池-未释放连接,java,spring,connection-pooling,Java,Spring,Connection Pooling,我有一个web应用程序在Tomcat7下运行,使用Spring和c3po作为连接池管理器。我还使用了dbcp,得到了相同的结果 我启动了一个长时间运行的单线程进程,该进程在各种dao中使用jdbcTemplate.update()等进行大量数据库调用。由于这些更新都是简单和独立的,因此没有使用事务管理器 由于某种原因,我的连接快用完了。似乎正在发生的事情是,每个dao都保持自己的连接,而不是将其返回到池中 这是正常的行为吗?我原以为该连接绑定到jdbcTemplate.update(),并在完成

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

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

由于某种原因,我的连接快用完了。似乎正在发生的事情是,每个
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>
所有的刀都是从

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

// ...

}
公共抽象类AbstractFileProcessorDao扩展了JDBCDAO支持{
// ...
}
在典型的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;
}
受保护的布尔runUpdateToSqlDatabase(映射值,映射值){
if(values.isEmpty())
返回true;
字符串sql=updateUpdaterServer.getSql(值,whereValues);
if(logger.isDebugEnabled())
debug(“服务器SQL->”+SQL);
getJdbcTemplate().update(sql);
返回false;
}

请检查您的应用程序是否存在对的“恶意”调用(您可以使用IDE搜索方法引用)。连接泄漏通常是由于获得了一个连接而导致的,而该连接从未通过关闭


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

要获得连接释放等功能,您需要一个事务管理器,而且即使您的更新很简单,您也应该管理事务。不是数据库层应该是事务性的,而是您的服务层应该驱动事务。@M.Deinum您需要一个事务管理器-您的评论对于OP的问题没有意义。如果未释放连接(即返回池),则问题一定在代码中的某个地方。拥有TX经理是针对不同主题的建议。JdbcTemplate不需要活动事务才能正常工作。您应该使用TX管理,但没有它不会导致您的问题。顺便说一句,您是否在代码中手动调用?请添加一些代码和配置。所有dao都扩展了一个抽象类,扩展了JDBCDAO支持。例外情况是指如果我没有提供足够的池连接,最终会出现错误吗?如果是这样,它将最终锁定在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;
}