錯誤現象
javax.servlet.ServletException: org.springframework.transaction.CannotCreateTransactionException:
Could not open Hibernate Session for transaction;
nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open connection
Root Cause: org.springframework.transaction.CannotCreateTransactionException:
Could not open Hibernate Session for transaction;
nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open connection
三大核心排查方向
1. JDBC URL 中文冒號(極高概率)
jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8
jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8
**檢查方法**:複製 URL 到純文本編輯器(如 Notepad++),開啟「顯示所有字符」,冒號應顯示為 `:` 而非 `:`。
2. 數據庫服務器防火牆/安全組
- **Windows 防火牆**:入站規則允許 3306 (MySQL) / 1433 (SQL Server) / 1521 (Oracle)
- **雲服務器安全組**:阿里云/騰訊云/華為云控制台 → 安全組 → 入站規則放行對應端口
- **數據庫自身權限**:
GRANT ALL ON *.* TO 'user'@'%' IDENTIFIED BY 'pass'; FLUSH PRIVILEGES;(注意 `@'%'` 允許遠程訪問)
3. 網段不通/內網穿透
| 場景 | 現象 | 解決 |
| 機房電脑能連,自己電腦不能 | 機房在內網,自己在外網/不同VLAN | VPN/內網穿透/跳板機/映射端口 |
| 本地回環正常,IP不通 | bind-address=127.0.0.1 | my.cnf 設置 bind-address=0.0.0.0 並重啟 |
| Docker 容器數據庫 | 宿主機 IP 無法訪問容器端口 | docker run -p 3306:3306 或 host 網絡模式 |
快速驗證步驟
- Telnet 測試端口通達性:
telnet 3306(Windows 需啟用 Telnet 客戶端)
- 命令行客戶端測試:
mysql -h -u user -p
- 檢查 hibernate.cfg.xml:URL、用戶名、密碼、驅動類名
- 對比機房環境:導出機房正確配置文件,僅修改 IP/密碼後對比
配置文件檢查清單
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://192.168.1.100:3306/mydb?useSSL=false&serverTimezone=UTC</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<!-- 連接池基礎配置 -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_statements">50</property>
總結
- 🥇 **第一檢查**:JDBC URL 冒號是否為半角英文
- 🥈 **第二檢查**:服務器防火牆/安全組/數據庫遠程權限
- 🥉 **第三檢查**:網絡互通性、bind-address、Docker 端口映射
- 💡 **調試原則**:先用命令行客戶端直連,通了再排查框架配置
- 上一篇文章: jQuery Tab 切換時內容區域高度塌陷導致元素跑出邊框:CSS overflow 修復方案
- 下一篇文章: JavaScript GetXmlHttpObject() 詳解:AJAX 核心對象創建與封裝
Copyright ©
程式碼之家 All Rights Reserved