使用ConnectionManager適應多資料庫的應用環境

來源:互聯網
上載者:User
connection|資料|資料庫
原文:

 今天公司專屬應用程式環境中一般情況下要面對不止一個或一類資料庫;另一方面不同時期的不同種類的資料庫形成一個個的荒島;在java中,技術潮流傾向於不是直接操作資料庫記錄,而是通過中介層的資料庫物件持久化處理達到OO的目的。無論那一種,都要求比較容易地面對多個資料庫連接。多個資料庫連接比較為人所熟悉的是微軟的ODBC資料來源設定,除了沒有實現中介層持久化外,ODBC其實比JDBC要全面也更容易處理。ConnectionManager是一個通過 XML設定的,類似於ODBC資料來源設定的東西,通過定義dao.Connection對象,程式可以按需要以:java.sql.Connection conn   =ConnectionManager.getConnection(${connectionname});得到所需要的串連,從而簡化了在多個資料庫環境下的編輯工作。

    現在項目開發人員面臨的常常是多個資料庫的應用,曆史的和不同部門的,有CS背景也有BS前台的。各個資料庫的資料必須融匯到同一個商務邏輯中,否則就成為一個個低價值的資料孤島。應對這種需求,目前使用了兩種技術,一是資料對象化技術,實質就是在資料層和應用邏輯層中間插入一個持久對象化層,通過程式或容器使資料對象與資料記錄相一致,而應用邏輯直接存取資料對象而不是資料庫記錄;二是通過使用全域目錄調動使用多個資料庫供資料對象化管理層使用。無論是 EJB ENTITy,還是Hibernate,抑或是我處已寫的Hanva Processor都是這種思路的一種體現。

    並不總是需要採用EJB才能管理多個資料來源,何況大部分項目中採用EJB帶的是更高的成本和效能的更低效,開發工作更複雜化,甚至只是碰運氣地填代碼再發布不行再填代碼再碰運氣,(我本人很討厭這種開發感覺,所以搞了一個Hanva的小項目,除非客戶指定EJB了)。不過EJB容器中管理多個資料來源的方式還是很值得學習的。大部分情況下,它是通過初始化後的資料來源對象,象串連池,註冊進JNDI SPI;然後通過java.naming.Context.lookup()這個全域名稱(在JVM範圍內)。我的做法是由寫一個 ConnectionManager,它由一個xml檔案定義多個資料庫連接相關的參數,在ConnectionManager初始化時讀入記憶體。使用時然後通過調用ConnectionManager的靜態方法getConnection (String connectionname),就可以得到指定資料庫連接。由於實際上操作資料庫串連的都是Processor和Lister兩個類,這樣,要保證串連資源的釋放也是很有把握的。依靠這個方法,就可以在輕型的應用中都可以搞妥多資料庫,使用資料對象化方式進行開發了。

connections.xml定義:

<connection-set><description><![CDATA[ connection-set供ConnectionManager使用,可以按需要取用不定的多個串連定義,代碼完全不變。從而適應多資料庫的使用環境;]]></description> <connection name="GlobalPool" driver="datasource" uri="java:comp/env/globalpool" /> <connection name="MysqlPool" driver="datasource" uri="java:comp/env/mysqlpool" /> <connection name="mysql" driver="com.mysql.jdbc.Driver" username="michelle" password="favordog">  <uri><![CDATA[jdbc:mysql://127.0.0.1:3306/dkt?useUnicode=true&characterEncoding=gb2312]]></uri> </connection>  <connection name="conn" driver="oracle.jdbc.driver.OracleDriver"   uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0" username="dcon" password="girlfriend" /> <connection name="reso" driver="oracle.jdbc.driver.OracleDriver"   uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0" username="erso" password="abc" /> <connection name="daifu" driver="oracle.jdbc.driver.OracleDriver"   uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0" username="eef" password="qwewer" /> <connection name="system" driver="oracle.jdbc.driver.OracleDriver"   uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0" username="system" password="manager" /></connection-set>

ConnectionManager方法:

public class ConnectionManager{  private static LOGGER logger =(LOGGER)Loger.getLogger(Constants.LOGGER_DAIFU_KEY);

public static synchronized java.sql.Connection getConnection() throws java.sql.SQLException{ String name =Repository.getInstance().getConn(); return getConnection(name); }

public static synchronized java.sql.Connection getConnection(String name) throws java.sql.SQLException{ if(Repository.getInstance()==null){  logger.error("the repository for dao operation has not been initialized");  return null;  } dao.Connection conn =Repository.getInstance().getConnection(name); String dri =conn.getDriver(); java.sql.Connection cn =null; try{  if(dri.equalsIgnoreCase("datasource")){   javax.naming.Context initCtx = new javax.naming.InitialContext();   javax.sql.DataSource ds = (javax.sql.DataSource)initCtx.lookup(conn.getUri());          cn        = ds.getConnection();   }   else{   Class.forName(dri);//no newInstance();only get class                 cn = java.sql.DriverManager.getConnection(conn.getUri(),conn.getUsername(),conn.getPassword());   }   }catch(Exception ex){  String msg ="ConnectionManager.class,conname:="+name+";dri:="+dri+";cn:="+cn+";msg:="+ex.getMessage();  logger.error(msg,ConnectionManager.class);  throw new java.sql.SQLException(msg);  } return cn; } public static synchronized java.sql.Connection getConnection(dao.Connection conn) throws java.sql.SQLException{ if(conn==null){  System.out.println("the dao.Connection to getConnection is null;");  return null;  } String dri =conn.getDriver(); java.sql.Connection cn =null; try{  if(dri.equalsIgnoreCase("datasource")){   javax.naming.Context initCtx = new javax.naming.InitialContext();   javax.sql.DataSource ds = (javax.sql.DataSource)initCtx.lookup(conn.getUri());          cn        = ds.getConnection();   }   else{   Class.forName(dri);//no newInstance();only get class                 cn = java.sql.DriverManager.getConnection(conn.getUri(),conn.getUsername(),conn.getPassword());   }   }catch(Exception ex){  String msg ="dri:="+dri+";cn:="+cn+";msg:="+ex.getMessage();  logger.error(msg,ConnectionManager.class);  throw new java.sql.SQLException(msg);  } return cn; }  public static void main(String[] args) throws Exception{ if(args==null || args.length<2){   System.out.println(" Please input the xml and conn's name");  return;  } Repository.parse(args[0]);  java.sql.Connection conn =getConnection(args[1]); System.out.println(conn); }

}

調用時只需要

java.sql.Connection conn =ConnectionManager.getConnection("connn");

就可以得到指定方式的資料庫連接。


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。