JDBC 開發中硬編碼數據庫 URL、用戶名、密碼存在安全性差、可移植性低、運維困難等問題。JDBC 2.0 引入 DataSource 接口,配合 JNDI 實現連接信息外部化、邏輯名稱查找、連接池管理、聲明式事務。本文詳細講解 DataSource 標準屬性、Oracle 擴展、獨立使用與 JNDI 綁定兩種模式,附完整代碼示例。
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@Chicago:1521:chidb", "guest", "guest");
三大缺陷:
javax.sql.DataSource 定義 9 個標準屬性(Oracle 未實現 roleName):
| 屬性 | 類型 | 說明 |
|---|---|---|
| databaseName | String | 數據庫 SID |
| dataSourceName | String | 實現類名 |
| description | String | 描述信息 |
| networkProtocol | String | 網絡協議(OCI 驅動有效) |
| password | String | 登錄密碼(僅有 setter,無 getter,保證安全) |
| portNumber | int | 端口,默認 1521 |
| serverName | String | 服務器主機名 |
| user | String | 登錄用戶名 |
所有 getter/setter 均為 synchronized,保證線程安全。
oracle.jdbc.pool.OracleDataSource 額外提供:
| 屬性 | 類型 | 說明 |
|---|---|---|
| driverType | String | 驅動類型:oci8 / thin / kprb (服務端內部) |
| url | String | 完整 JDBC URL,設置後其他屬性失效 |
| tnsEntry | String | TNS 名稱,設置後網絡屬性失效 |
同時實現 Serializable、Referenceable 支持 JNDI 存儲。
OracleDataSource ods = new OracleDataSource();
ods.setDriverType("thin");
ods.setServerName("Chicago");
ods.setNetworkProtocol("tcp");
ods.setDatabaseName("chidb");
ods.setPortNumber(1521);
ods.setUser("guest");
ods.setPassword("guest");
Connection conn = ods.getConnection(); // 獲取連接
// ... 使用連接
conn.close();
屬性生效優先級:url > tnsEntry > 分散屬性。driverType=kprb 時其他屬性全部失效。
// 初始化 JNDI 環境 (文件系統提供者)
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL, "file:JNDI"); // 本地目錄
Context ctx = new InitialContext(env);
// 創建並配置 DataSource
OracleDataSource ods = new OracleDataSource();
ods.setDriverType("thin");
ods.setServerName("Chicago");
ods.setNetworkProtocol("tcp");
ods.setDatabaseName("chidb");
ods.setPortNumber(1521);
ods.setUser("guest");
ods.setPassword("guest");
// 綁定邏輯名稱
ctx.bind("jdbc/chidb", ods);
生成 .binding 文件記錄映射關係。
Context ctx = new InitialContext(env);
OracleDataSource ods = (OracleDataSource) ctx.lookup("jdbc/chidb");
Connection conn = ods.getConnection();
// ... 業務操作
conn.close();
核心優勢:應用代碼零數據庫細節,僅依賴邏輯名 jdbc/chidb。部署時由運維在應用服務器配置真實 DataSource,實現開發/測試/生產環境零代碼差異。
jdbc/<業務模塊>,如 jdbc/bookstoreDriverManager、嚴禁硬編碼連接參數DataSource + JNDI 是 Java EE 數據庫訪問的基石,也是 Spring、Hibernate 等框架整合數據源的標準入口。徹底掌握其配置與原理,是通往高級 Java 架構師的必經之路。