[Java实战]Spring Boot整合达梦数据库连接池配置(三十四)
一、HikariCP连接池配置(默认)
1. 基础配置(application.yml
)
yaml
spring:
datasource:
driver-class-name: dm.jdbc.driver.DmDriver
url: jdbc:dm://localhost:5236/DB_NAME?schema=SYSDBA
username: SYSDBA
password: SYSDBA
# HikariCP连接池配置
hikari:
pool-name: DM-HikariPool
connection-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...
确认连接池初始化成功:
log
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
)
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
)
yaml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: dm.jdbc.driver.DmDriver
url: jdbc:dm://localhost:5236/DB_NAME?schema=SYSDBA
username: SYSDBA
password: SYSDBA
druid:
# 连接池核心配置
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
# 监控配置
filter:
stat:
enabled: true
log-slow-sql: true
slow-sql-millis: 2000
web-stat-filter:
enabled: true
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: admin123
3. 添加达梦方言配置类
java
@Configuration
public class DruidConfig {
@Bean
public 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:连接泄漏检测
java
@SpringBootTest
public class ConnectionLeakTest {
@Autowired
private DataSource dataSource;
@Test
public void testConnectionLeak() throws SQLException {
for(int i=0; i<30; i++) {
Connection conn = dataSource.getConnection();
// 未关闭连接,触发连接池警告
System.out.println("获取连接:"+conn);
}
}
}
预期日志:
log
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. 连接池参数建议
yaml
druid:
max-active: 50 # 根据DB最大连接数设置
initial-size: 10
min-idle: 10
max-wait: 3000 # 获取连接超时时间
time-between-eviction-runs-millis: 60000 # 检测间隔
min-evictable-idle-time-millis: 300000 # 最小空闲时间
2. 安全加固
yaml
druid:
filter:
wall:
config:
delete-allow: false # 禁止DELETE无WHERE
drop-table-allow: false
3. 定期监控指标
- 活跃连接数 :
DataSource.getActiveCount()
- 等待线程数 :
DataSource.getWaitThreadCount()
- SQL执行时间:通过Druid监控页查看
五、常见问题解决
问题1:连接池初始化失败
错误信息 :Failed to initialize pool: Unknown database 'DB_NAME'
解决方案:
- 检查达梦服务是否运行
- 验证数据库名称是否正确
- 确认用户权限:
SYSDBA
默认有DBA权限
问题2:连接泄漏
现象 :活跃连接数持续增长不释放
排查步骤:
-
启用Druid的
removeAbandoned
配置yamldruid: remove-abandoned: true remove-abandoned-timeout: 300 # 5分钟未关闭连接强制回收
-
分析日志中
abandoned connection
警告定位代码
希望本教程对您有帮助,请点赞❤️收藏⭐关注支持!欢迎在评论区留言交流技术细节!