<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<!-- 基礎連接信息 -->
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="driverClassName" value="${jdbc.driver}" />
<!-- 連接池規模 -->
<property name="initialSize" value="10" /> <!-- 初始化連接數 -->
<property name="minIdle" value="10" /> <!-- 最小空閒 -->
<property name="maxActive" value="100" /> <!-- 最大活躍 -->
<property name="maxWait" value="60000" /> <!-- 獲取連接超時(ms) -->
<!-- 生命周期管理 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 檢測間隔 -->
<property name="minEvictableIdleTimeMillis" value="300000" /> <!-- 空閒存活最小時間 -->
<property name="validationQuery" value="SELECT 1" /> <!-- 檢測 SQL -->
<property name="testWhileIdle" value="true" /> <!-- 空閒時檢測 -->
<property name="testOnBorrow" value="false" /> <!-- 借用時檢測(影響性能) -->
<property name="testOnReturn" value="false" /> <!-- 歸還時檢測 -->
<!-- PSCache 優化 (Oracle/PostgreSQL 建議開啟) -->
<property name="maxOpenPreparedStatements" value="20" />
<property name="poolPreparedStatements" value="true" />
<!-- 防連接泄漏 -->
<property name="removeAbandoned" value="true" />
<property name="removeAbandonedTimeout" value="1800" /> <!-- 30分鐘 -->
<property name="logAbandoned" value="true" />
<!-- 監控統計 -->
<property name="filters" value="stat,wall,slf4j" /> <!-- 統計、SQL防火牆、日志 -->
</bean>
| 參數 | 推薦值 | 說明 |
|---|---|---|
| initialSize/minIdle | CPU核數 * 2 | 預熱連接,避免冷啟動延遲 |
| maxActive | (CPU核數 * 2) + 磁盤數 * 2 | 根據壓測調整,防止數據庫連接數耗盡 |
| maxWait | 60000 | 業務容忍度,配合熔斷器使用 |
| validationQuery | SELECT 1 / SELECT 1 FROM DUAL | 極輕量,MySQL/Oracle 通用 |
| testWhileIdle | true | 後台線程檢測,不影響業務線程 |
| filters: stat | 必開 | 提供監控數據源,配合 Druid StatViewServlet |
| filters: wall | 生產必開 | SQL 注入防火牆,攔截高風險語句 |
<!-- web.xml 註冊監控 Servlet -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<param-name>allow</param-name>
<param-value>127.0.0.1,192.168.1.0/24</param-value> <!-- 白名單 -->
</init-param>
<init-param>
<param-name>loginUsername</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>loginPassword</param-name>
<param-value>strongPassword</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
訪問 https://host:port/druid/index.html 查看實時連接池狀態、SQL 執行統計、慢查詢排行。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.20</version> <!-- 檢查最新版 -->
</dependency>
removeAbandoned 自動回收泄漏連接,解決「忘記 close」導致連接池耗盡。com.mysql.cj.jdbc.Driver,舊版 com.mysql.jdbc.Driver 已棄用。spring.datasource.type=com.alibaba.druid.pool.DruidDataSource。druid.filter.stat.log-slow-sql 產生的慢查詢日志,防止磁盤寫滿。