本文将从以下几个方面对druiddatasourceautoconfigure too many connections做详细的阐述,并提供对应的代码示例,帮助读者理解和解决该问题。
一、什么是druiddatasourceautoconfigure too many connections
druiddatasourceautoconfigure是一个Spring Boot官方提供的连接池配置自动化依赖库,可以简化在Spring Boot项目中使用Druid连接池配置的过程。too many connections则是Druid连接池在程序运行时,因为连接过多而抛出的异常。
二、过多的连接是如何产生的
过多的连接往往是由于配置不当以及程序逻辑上的疏漏造成的。以下是一些可能导致连接过多的原因:
1. 数据库连接池初始化过多的连接数;
2. 错误的数据库使用姿势,例如忘记关闭Connection等;
3. 数据库连接失效后,未及时清理重建,导致连接过多;
4. 程序逻辑上的错误,导致重复创建连接,没有重复释放连接等。
三、解决druiddatasourceautoconfigure too many connections的方法
1. 减少连接池初始化数量
通过减少连接池初始化数量,可以避免连接过多的问题。在application.yaml或application.properties中,修改以下配置项:
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.max-active=20 #最大连接数
spring.datasource.max-idle=10 #最大空闲连接数
spring.datasource.min-idle=5 #最小空闲连接数
2. 正确使用数据库连接姿势
正确使用数据库连接姿势,可以避免一些常见的错误,例如忘记关闭Connection等。以下是正确的使用方式:
Connection conn = null;
Statement stmt = null;
try {
//获取连接
conn = dataSource.getConnection();
//执行查询语句
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(querySql);
//处理结果集
...
} catch (SQLException e) {
//异常处理
} finally {
//关闭连接和Statement
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
//异常处理
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
//异常处理
}
}
}
3. 配置连接失效检测和检测间隔时间
通过配置连接失效检测和检测间隔时间,可以清理失效连接,避免连接过多。以下是配置方式:
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.validation-query=SELECT 1 FROM dual #失效检测sql语句
spring.datasource.test-on-borrow=true #借用时检测
spring.datasource.test-while-idle=true #空闲检测
spring.datasource.time-between-eviction-runs-millis=60000 #检测间隔1min
4. 程序逻辑改善
通过优化程序逻辑,减少创建多余连接等操作,可以避免连接过多的问题。例如,在并发请求时,可以将Connection作为ThreadLocal变量存储,在程序逻辑上避免重复创建、重复释放。
四、代码示例
以下是使用Druid连接池配置的示例代码:
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix="spring.datasource")
public DataSource druidDataSource() {
return new DruidDataSource();
}
@Bean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean registrationBean = new ServletRegistrationBean();
registrationBean.setServlet(new StatViewServlet());
registrationBean.addUrlMappings("/druid/*");
Map initParams = new HashMap<>();
initParams.put("loginUsername", "admin");
initParams.put("loginPassword", "admin");
registrationBean.setInitParameters(initParams);
return registrationBean;
}
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
Map initParams = new HashMap<>();
initParams.put("exclusions","*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*");
filterRegistrationBean.setInitParameters(initParams);
return filterRegistrationBean;
}
}