首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

ConnectionManager:XML 驅動的多數據源無縫切換方案

     編輯:Java 相關知識

背景痛點

  • 企業應用常面臨多數據庫共存(歷史系統、部門割裂、CS/BS 混合)。
  • 數據孤島必須融合進統一業務邏輯,否則價值大打折扣。
  • 主流方案:持久化對象層(Hibernate/EJB/自研)+ 全局目錄管理數據源(JNDI)。
  • EJB 容器雖強但成本高、性能差、開發複雜,輕量級項目需更簡潔方案。

ConnectionManager 設計思路

參考 EJB 容器管理數據源模式:XML 定義連接參數 → 啟動時載入內存 → 靜態方法 getConnection(name) 獲取連接 → 由持久化層(Processor/Listener)統一管理釋放,資源可控。

connections.xml 定義範例

<CONNECTION-SET>
  <CONNECTION name="GlobalPool" uri="java:comp/env/globalpool" driver="datasource"/>
  <CONNECTION name="MysqlPool" uri="java:comp/env/mysqlpool" driver="datasource"/>
  <CONNECTION name="mysql" driver="com.mysql.jdbc.Driver"
      username="michelle" password="favordog" uri="jdbc:mysql://..."/>
  <CONNECTION name="conn" driver="oracle.jdbc.driver.OracleDriver"
      username="dcon" password="girlfriend" uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0"/>
  <!-- 更多 Oracle 實例... -->
</CONNECTION-SET>

支持 datasource (JNDI 查找) 與 JDBC 直連雙模式。

核心代碼實現

public class ConnectionManager {
    private static Logger logger = ...;

    public static synchronized Connection getConnection() throws SQLException {
        return getConnection(Repository.getInstance().getConn());
    }

    public static synchronized Connection getConnection(String name) throws SQLException {
        dao.Connection connDef = Repository.getInstance().getConnection(name);
        String driver = connDef.getDriver();
        Connection cn = null;
        try {
            if ("datasource".equalsIgnoreCase(driver)) {
                Context ctx = new InitialContext();
                DataSource ds = (DataSource) ctx.lookup(connDef.getUri());
                cn = ds.getConnection();
            } else {
                Class.forName(driver);
                cn = DriverManager.getConnection(connDef.getUri(), 
                    connDef.getUsername(), connDef.getPassword());
            }
        } catch (Exception ex) {
            throw new SQLException("Connection failed: " + ex.getMessage());
        }
        return cn;
    }
    // 重載支持直接傳入 dao.Connection 對象
    // main 方法支持命令行測試
}

調用極簡

Connection conn = ConnectionManager.getConnection("conn");

一行代碼獲取指定數據庫連接,屏蔽底層差異,輕量級應用亦能優雅應對多數據源環境。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved