我有一个场景,其中我需要在应用程序运行期间动态切换数据源 时间。
为此我有一个JDBCManager类,它维护一个池数据源(C3P0)的映射,根据特定的spring jdbctemplate的请求,我查看了key并返回了与数据源相应的jdbctemplate。如下
public JdbcTemplate getJdbcTemplate(long targetId) throws DataAccessDeniedException {
return new JdbcTemplate(this.map.get(targetId));
}
我没有在配置中配置任何事务管理器,也没有附加任何事务管理器,而我在实际创建Datasourec如下所示
DriverManagerDataSource dataSource = null;
dataSource = new DriverManagerDataSource();
// DataSource dataSource = DataSources.unpooledDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(userId);
dataSource.setPassword(userPassword);
DataSource pooledDataSource;
try {
Map<String, Object> overrides = new HashMap<String, Object>();
overrides.put("minPoolSize", minPoolSize);
overrides.put("maxPoolSize", maxPoolSize);
overrides.put("acquireIncrement", acquireIncrement);
overrides.put("maxIdleTime", maxIdleTime);
overrides.put("idleConnectionTestPeriod", idleConnectionTestPeriod);
overrides.put("maxIdleTimeExcessConnections", maxIdleTimeExcessConnections);
overrides.put("numHelperThreads", numHelperThreads);
overrides.put("unreturnedConnectionTimeout", unreturnedConnectionTimeout);
overrides.put("checkoutTimeout", checkoutTimeout);
// create the PooledDataSource with overrides
pooledDataSource = DataSources.pooledDataSource(dataSource, overrides);
} catch (SQLException e) {
logger.error("Could not create pooled datasource for target: " + targetId);
throw new RuntimeException(e);
}
// cache the pooledDataSource
this.map.put(targetId, pooledDataSource);
return pooledDataSource;
}
目前我面临的问题是,经过几分钟的处理,我的c3p0连接池用尽连接,一切都开始失败并出现以下错误
Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@65d43d1e -- timeout at awaitAvailable()
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1416)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:606)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:526)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:756)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:683)
... 61 more
我怀疑交易出现问题或连接泄漏。
我怀疑在没有配置事务管理器的情况下,jdbctemplate会正确地释放/管理连接吗?