使用ConnectionManager適應多數據庫的應用環境
今天企業應用環境中一般情況下要面對不止一個或一類數據庫;另一方面不同時期的不同種類的數據庫形成一個個的荒島;在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定義:
]]>
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");
就可以得到指定方式的數據庫連接。
http://blog.csdn.net/zwwwxy/archive/2005/04/01/334718.aspx
http://zwwwxy.blogchina.com/808527.html
http://javaxml.blog-city.com/connectionmanager.htm
0 Comments:
Post a Comment
<< Home