生產環境專案啟動連接資料庫時拋出 ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 錯誤。原始連接配置如下:
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@158.58.88.102:1521:eskdb
username=root
password=aaa111
tnsnames.ora 配置:
eskdb=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 158.58.88.102)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = eskdb)))
eskdb),但連接失敗SERVICE_NAME,但 tnsnames.ora 中已設為 eskdb,仍失敗經 DBA 確認,資料庫實際 SID 為 eskdb1。JDBC Thin 驅動程式的 URL 格式為:
jdbc:oracle:thin:@::
若需使用 Service Name,必須採用完整 TNS 描述符格式:
jdbc:oracle:thin:@//:/
或使用 DESCRIPTION 完整語法。
修正 URL 使用正確 SID:
url=jdbc:oracle:thin:@158.58.88.102:1521:eskdb1
重啟專案後連接成功。
| 連接格式 | URL 範例 | 適用場景 |
|---|---|---|
| SID 格式 | @host:port:SID | JDBC Thin 簡易格式,需知 SID |
| Service Name 格式 | @//host:port/service_name | 推薦生產環境,支援 RAC/負載均衡 |
| 完整 TNS 描述符 | @(DESCRIPTION=...) | 複雜網路配置、多地址負載均衡 |
核心提醒:JDBC Thin 簡易格式 @host:port:xxx 中的 xxx 代表 SID,而非 Service Name。混淆兩者是導致 ORA-12505 的常見原因。