我有一个在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;
}
答案 0 :(得分:1)
请检查您的申请&#34; rogue&#34;调用DataSource#getConnection
(您可以使用IDE搜索方法引用)。连接泄漏通常是通过获取连接而导致的,然后通过Connection#close
永远不会关闭。
使用Spring的JdbcTemplate
时,所有JDBC资源处理(打开/关闭连接,语句,结果集)都会自动完成。但是使用遗留代码你永远不会知道。