[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
警告定位代碼
希望本教程對您有幫助,請點贊??收藏?關注支持!歡迎在評論區留言交流技術細節!