我已经通过AppConfig类中的注释配置了数据源
@Bean(destroyMethod = "close")
public BasicDataSource basicDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
dataSource.setUrl(env.getRequiredProperty("jdbc.url"));
dataSource.setUsername(env.getRequiredProperty("jdbc.username"));
dataSource.setPassword(env.getRequiredProperty("jdbc.password"));
dataSource.setValidationQuery("SELECT 1 from dual");
dataSource.setMaxIdle(40);
dataSource.setMaxTotal(50);
dataSource.setMinIdle(20);
dataSource.setMaxWaitMillis(5000);
dataSource.setTestOnBorrow(true);
dataSource.setTestOnReturn(true);
dataSource.setTestWhileIdle(true);
dataSource.setTimeBetweenEvictionRunsMillis(30000);
dataSource.setRemoveAbandonedOnBorrow(true);
dataSource.setRemoveAbandonedTimeout(30);
dataSource.setNumTestsPerEvictionRun(3);
dataSource.setMinEvictableIdleTimeMillis(1800000);
return dataSource;
}
在我的mvc项目中,我创建了一个组件JDBCService,在其中创建了jdbcTemplate对象,并使用数据源将其初始化。
@Component
public class JDBCService {
JdbcTemplate jdbcTemplate;
public void resetAllVariables() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(AppConfig.class);
ctx.refresh();
DataSource dataSource = (DataSource) ctx.getBean("basicDataSource");
jdbcTemplate = new JdbcTemplate(dataSource);
}
//other functions like updateQuery(String sQuery, Object[] params)
.....
}
在整个应用程序中,我对JDBCService进行了各种调用并执行sql语句。某些页面有多个对数据库的调用。一个调用看起来像这样:
class SearchService {
JDBCService jdbcService = new JDBCService();
jdbcService.resetAllVariable();
jdbcService.updateQuery(....);
}
我在v $ session中看到的是,当我运行jMeter时,它不会创建池,而是继续创建连接。因此,当我的应用程序达到990个连接时,它就会失败,因为我们的DBA设置了限制。为什么池不起作用? 我做的另一项测试是作为单个会话测试-每次重新加载同一页面时,都会看到创建了4个新的数据库会话。每次重新加载都会增加4个数据库会话。如果我将maxTotal减少到8,那么最大连接数应该不是刚好达到8,还是没有更多。