[Java实战]Spring Boot整合达梦数据库连接池配置(三十四)
一、HikariCP连接池配置(默认)
1. 基础配置(application.yml
)
spring:datasource:driver-class-name: dm.jdbc.driver.DmDriverurl: jdbc:dm://localhost:5236/DB_NAME?schema=SYSDBAusername: SYSDBApassword: SYSDBA# HikariCP连接池配置hikari:pool-name: DM-HikariPoolconnection-timeout: 30000 # 连接超时时间(ms)maximum-pool-size: 20 # 最大连接数minimum-idle: 5 # 最小空闲连接idle-timeout: 600000 # 空闲连接超时时间(ms)max-lifetime: 1800000 # 连接最大存活时间(ms)connection-test-query: SELECT 1 FROM DUAL
2. 验证配置生效
在应用启动日志中搜索 HikariPool-1 - Starting...
确认连接池初始化成功:
2024-05-26 14:20:00.123 INFO [main] com.zaxxer.hikari.HikariDataSource
- HikariPool-1 - Starting...
2024-05-26 14:20:01.456 INFO [main] com.zaxxer.hikari.HikariDataSource
- HikariPool-1 - Start completed.
二、Druid连接池配置(推荐监控功能)
1. 添加Druid依赖(pom.xml
)
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.18</version>
</dependency><!-- 达梦JDBC驱动 --><dependency><groupId>com.dameng</groupId><artifactId>Dm8JdbcDriver18</artifactId><version>8.1.1.49</version></dependency>
2. 完整配置(application.yml
)
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: dm.jdbc.driver.DmDriverurl: jdbc:dm://localhost:5236/DB_NAME?schema=SYSDBAusername: SYSDBApassword: SYSDBAdruid:# 连接池核心配置initial-size: 5min-idle: 5max-active: 20max-wait: 60000# 监控配置filter:stat:enabled: truelog-slow-sql: trueslow-sql-millis: 2000web-stat-filter:enabled: truestat-view-servlet:enabled: trueurl-pattern: /druid/*login-username: adminlogin-password: admin123
3. 添加达梦方言配置类
@Configuration
public class DruidConfig {@Beanpublic DruidStatInterceptor druidStatInterceptor() {return new DruidStatInterceptor();}@Bean@Role(BeanDefinition.ROLE_INFRASTRUCTURE)public Advisor druidStatAdvisor() {return new DefaultPointcutAdvisor(new AnnotationMatchingPointcut(WebService.class, null),druidStatInterceptor());}
}
4. 访问监控页面
启动应用后访问监控面板:
http://localhost:8080/druid/login.html
使用配置的用户名密码登录(示例中为admin/admin123
)
三、连接池验证测试
测试1:连接泄漏检测
@SpringBootTest
public class ConnectionLeakTest {@Autowiredprivate DataSource dataSource;@Testpublic void testConnectionLeak() throws SQLException {for(int i=0; i<30; i++) {Connection conn = dataSource.getConnection();// 未关闭连接,触发连接池警告System.out.println("获取连接:"+conn);}}
}
预期日志:
ERROR [alibaba.druid.pool.DruidDataSource] - discard connection,
activeCount 20, maxActive 20
测试2:性能压力测试
使用JMeter模拟100并发查询请求,观察连接池表现:
监控指标 | 正常范围 | 异常处理建议 |
---|---|---|
ActiveCount | <= maxActive | 调大maxActive |
WaitThreadCount | 持续>0 | 检查慢SQL或连接泄漏 |
PoolingCount | ≈ maxActive/2 | 调整initialSize/minIdle |
四、生产环境最佳实践
1. 连接池参数建议
druid:max-active: 50 # 根据DB最大连接数设置initial-size: 10min-idle: 10max-wait: 3000 # 获取连接超时时间time-between-eviction-runs-millis: 60000 # 检测间隔min-evictable-idle-time-millis: 300000 # 最小空闲时间
2. 安全加固
druid:filter:wall:config:delete-allow: false # 禁止DELETE无WHEREdrop-table-allow: false
3. 定期监控指标
- 活跃连接数:
DataSource.getActiveCount()
- 等待线程数:
DataSource.getWaitThreadCount()
- SQL执行时间:通过Druid监控页查看
五、常见问题解决
问题1:连接池初始化失败
错误信息:Failed to initialize pool: Unknown database 'DB_NAME'
解决方案:
- 检查达梦服务是否运行
- 验证数据库名称是否正确
- 确认用户权限:
SYSDBA
默认有DBA权限
问题2:连接泄漏
现象:活跃连接数持续增长不释放
排查步骤:
- 启用Druid的
removeAbandoned
配置druid:remove-abandoned: trueremove-abandoned-timeout: 300 # 5分钟未关闭连接强制回收
- 分析日志中
abandoned connection
警告定位代码
希望本教程对您有帮助,请点赞❤️收藏⭐关注支持!欢迎在评论区留言交流技术细节!