数据库连接池在配置的时候你会关注哪些方面?
各个维度都说说。
1 个回答
你很远,也很近,在脑海,也在心里,唯独不在身边…蓝魅线上项目使用数据库连接池时,我一般从以下几个角度关注线程安全和性能的平衡: ## 一、基础配置(必备参数) - **initialSize**:初始连接数。 - **maxActive(或maxPoolSize)**:最大连接数。 - **minIdle**:最小空闲连接数。 - **maxWait**:获取连接的最大等待时间,防止连接池耗尽时业务阻塞过久。 ## 二、性能优化配置(推荐关注) - **validationQuery**:验证连接有效性的SQL。 - **testOnBorrow/testOnReturn/testWhileIdle**: - 推荐开启`testWhileIdle`和`testOnBorrow`。 - **timeBetweenEvictionRunsMillis**:空闲连接检查间隔,及时释放废弃连接。 - **minEvictableIdleTimeMillis**:连接空闲超过该时间则被关闭。 > 推荐线上配置示例(以Druid为例): ```properties spring.datasource.druid.initialSize=10 spring.datasource.druid.maxActive=50 spring.datasource.druid.minIdle=5 spring.datasource.druid.maxWait=5000 spring.datasource.druid.timeBetweenEvictionRunsMillis=60000 spring.datasource.druid.minEvictableIdleTimeMillis=300000 ``` ## 二、连接有效性检测 - **validationQuery**:用来检测连接是否有效的SQL语句(如`SELECT 1`)。 - **testOnBorrow/testOnReturn/testWhileIdle**:连接获取/归还/空闲时是否检测连接有效性。 线上推荐: ```properties spring.datasource.druid.validationQuery=SELECT 1 spring.datasource.druid.testWhileIdle=true spring.datasource.druid.testOnBorrow=false spring.datasource.druid.testOnReturn=false ``` ## 三、连接泄露检测(防止连接泄露) - **removeAbandoned**:是否清除泄漏连接。 - **removeAbandonedTimeout**:超过多少秒未归还则认为泄漏。 - **logAbandoned**:记录泄漏连接的堆栈信息。 线上推荐设置: ```properties spring.datasource.druid.removeAbandoned=true spring.datasource.druid.removeAbandonedTimeout=300 spring.datasource.druid.logAbandoned=true ``` ## 四、性能监控与统计 - 开启连接池的监控,比如使用Druid内置的监控: - Druid监控面板(SQL监控、连接池监控、慢查询监控)。 推荐线上常用配置: ```properties spring.datasource.druid.filters=stat,wall,slf4j ``` ## 三、高级保护机制(避免线上DB压力过大) - **maxWait(最大等待)** - 限制连接获取等待时间,防止无限等待。 - **queryTimeout(SQL执行超时)** - 控制SQL最大执行时间,避免慢SQL耗尽资源。 - **连接泄漏监控** - 通过`removeAbandoned`机制自动释放泄漏连接。 ## 四、实际运维角度关注的重点: - **监控连接池实时状态**: - 连接数、等待队列长度、空闲连接数、活跃连接数。 - **告警机制**: - 当连接池占满(比如>80%)时自动告警,避免DB故障。 - **连接异常快速定位**: - 能够追踪连接泄漏来源(`logAbandoned`)。 - **慢SQL监控和分析**: - 及时发现和定位慢查询,避免线上长时间占用连接资源。 ## 四、总结与推荐实践: - 配置连接池时,务必设置初始连接、最大连接、有效性检查、泄漏检测等参数。 - 推荐使用Druid或HikariCP作为生产环境连接池。 - 线上一定要搭配连接池监控告警,提前预防和处理连接泄漏与压力问题。 ### 常规推荐参数示例(以Druid连接池为例): ```properties spring.datasource.druid.initialSize=10 spring.datasource.druid.minIdle=10 spring.datasource.druid.maxActive=50 spring.datasource.druid.maxWait=5000 spring.datasource.druid.validationQuery=SELECT 1 spring.datasource.druid.testOnBorrow=false spring.datasource.druid.testOnReturn=false spring.datasource.druid.testWhileIdle=true spring.datasource.druid.timeBetweenEvictionRunsMillis=60000 spring.datasource.druid.minEvictableIdleTimeMillis=300000 spring.datasource.druid.removeAbandoned=true spring.datasource.druid.removeAbandonedTimeout=1800 spring.datasource.druid.logAbandoned=true spring.datasource.druid.filters=stat,wall,slf4j ``` 总之,线上运维通常关注连接数上限、空闲释放策略、连接有效性检查、泄漏连接检测和实时监控告警,避免因数据库连接池使用不当导致生产事故。编辑于 2024-11-01 23:11 •IP属地 美国举报评论收藏
公众号进入网站体验更佳

