国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ConnectionManager適應多數據庫環境

2019-11-18 12:50:47
字體:
來源:轉載
供稿:網友

  今天企業應用環境中一般情況下要面對不止一個或一類數據庫;另一方面不同時期的不同種類的數據庫形成一個個的荒島;在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供ConnectionManager使用,可以按需要取用不定的多個連接定義,代碼完全不變。從而適應多數據庫的使用環境;
  ]]>
  
  uri="jdbc:Oracle:thin:@127.0.0.1:1521:dkt0" username="dcon" passWord="girlfriend" />
  
  uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0" username="erso" password="abc" />
  
  uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0" username="eef" password="qwewer" />
  
  uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0" username="system" password="manager" />
  
  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");
  
  就可以得到指定方式的數據庫連接。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临沭县| 修武县| 和林格尔县| 定结县| 宜州市| 富裕县| 迁安市| 梓潼县| 万年县| 宁都县| 遂昌县| 湄潭县| 特克斯县| 青浦区| 福建省| 金湖县| 林甸县| 交口县| 西吉县| 灌阳县| 普陀区| 康马县| 张家口市| 绥阳县| 巴林右旗| 武夷山市| 库车县| 邳州市| 阳东县| 保德县| 凤城市| 长宁区| 彰化市| 保亭| 阿坝| 射阳县| 固安县| 固原市| 芮城县| 高要市| 开化县|