首页 > 编程知识 正文

解决druiddatasourceautoconfigure too many connections的问题

时间:2023-11-19 21:57:44 阅读:289569 作者:QUHJ

本文将从以下几个方面对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;
    }
}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。