<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Kimi's NutShell

    我荒廢的今日,正是昨日殞身之人祈求的明日

    BlogJava 新隨筆 管理
      141 Posts :: 0 Stories :: 75 Comments :: 0 Trackbacks

    JDBC 2.0 API 包括兩個package:
      1. java.sql 為JDBC 2.0的核心包,其中包括了JDBC 1.0規(guī)范中規(guī)定的API和新的核心API,這個包包含于Java 2 Standard Edition中.
      2. javax.sql 為JDBC 2.0的標準擴展包,相對與JDBC 1.0而言是全新的,這個包包含于Java 2 Enterprise Edition中.

      ★ 采用了新的方法連接數(shù)據(jù)庫 DataSource Interface
      JDBC 2.0 提供了新的接口DataSource用來實現(xiàn)數(shù)據(jù)庫連接,可以替代1.0中提供的DriverManager類。好處是:
      ☆ 增強了代碼的可移植性
      ☆ 方便了代碼的維護
      一個DataSource對象代表一個實際的數(shù)據(jù)源。這個數(shù)據(jù)源可以是從關(guān)系數(shù)據(jù)庫到表格形式的文件,完全依賴于它是怎樣實現(xiàn)的.一個數(shù)據(jù)源對象注冊到JNDI名字服務(wù)后,應(yīng)用程序就可以從JNDI服務(wù)器上取得該對象,并使用之和數(shù)據(jù)源建立連接.
      數(shù)據(jù)源及如何裝入的信息(名字,地址,端口等等)以Properties的形式保存在DataSource對象中.這樣就增強了應(yīng)用程序的可移植性,因為程序中不需要像使用DriverManager那樣給出硬性的驅(qū)動器名字(往往包含了特定廠商的名字). 這種做法還增強了代碼的可維護性,比如數(shù)據(jù)源移植到另一臺服務(wù)器上后, 所需要作的就是更新一下相關(guān)的property,使用數(shù)據(jù)源的代碼更不不必改動.
      系統(tǒng)管理員或者有相應(yīng)權(quán)限的人實現(xiàn)DataSource對象. DataSource對象的實現(xiàn)需要設(shè)置對象的properties并把它注冊到JNDI名字服務(wù)器上, 這些活動可能會用特定工具來實現(xiàn). 系統(tǒng)管理員用一個邏輯名字對應(yīng)DataSource對象,這個名字可是是任意的. 在下面的例子中DataSource對象的名字是InventoryDB. 依照傳統(tǒng)習(xí)慣, DataSource對象的名字包含在jdbc下, 所以這個數(shù)據(jù)源對象的完整名字是:jdbc/InventoryDB.
      實現(xiàn)數(shù)據(jù)源對象后, 應(yīng)用程序員就可以使用它來建立和數(shù)據(jù)源之間的連接了. 下面的代碼片斷演示了通過這種方式獲得連接. 上面兩行使用了JNDI API獲得DataSource對象,第三行代碼使用JDBC API獲得連接:
      Context ctx = new InitialContext();
      DataSource ds = (DataSource) ctx.lookup("jdbc/InventoryDB"):
      Connection conn = ds.getConnection("password","username");
      DataSource對象中獲得的的Connection對象和用DriverManager.getConnection方法獲得的對象是等同的. 由于DataSource方法的優(yōu)點, 該方法成為獲得連接的推薦方法. 所有基于JDBC 2.0的驅(qū)動器應(yīng)該會包含DataSource接口的實現(xiàn)以及javax.sql包.
      對普通程序員而言, DataSource對象方法只是一種選擇. 如果要使用連接緩沖池(Connection pooling)或者分布式交換, 則必須使用DataSource對象獲得連接.原因在下文中闡述.
      ★ Connection Pooling
      連接緩沖池是這樣工作的:當(dāng)一個應(yīng)用程序關(guān)閉一個連接時, 這個連接并不真正釋放而是被循環(huán)利用.因為建立連接是消耗較大的操作, 循環(huán)利用連接可以顯著的提高性能,因為可以減少新連接的建立.
      比如一個應(yīng)用程序需要連接一個由名字是EmployeeDB的DataSource對象代表的數(shù)據(jù)源, 通過緩沖池獲得連接的代碼演示如下:
      Context ctx = new InitialContext();
      DataSource ds = (DataSource) ctx.lookup("jdbc/EmloyeeDB");
      Connection con = ds.getConnection("password","username");
      因為連接的數(shù)據(jù)源不同所以和上面的例子中的名字不一樣. DataSource.getConnction方法返回的連接是否被緩存完全依賴于該DataSource對象的實現(xiàn)方式. 如果它將用于支持連接緩沖的中間層服務(wù)器(Middle Tier Server), 則DataSource對象將自動返回將被緩存、循環(huán)利用的連接.
      基本上不需要改變?nèi)魏未a就可以獲得緩沖池連接. 唯一需要注意的就是(我們已經(jīng)這樣做了:P),需要在finally塊中釋放連接,這應(yīng)該是釋放所有連接的較好方法.這樣, 即使拋出了異常, 連接也會還給連接緩沖池:
      finally{
      if(con != null) con.close();
      }
      finally塊保證了連接的循環(huán)利用.
      ★ Distributed Transactions(分布式交換)
      獲得用于分布式交換的情形類似于獲得緩沖池連接. 差別仍然是DataSource對象的實現(xiàn)方式, 而不是獲得連接程序代碼的不同.
      假定DataSource類被實現(xiàn)為用于中間件的分布式交換設(shè)施,下面的代碼將獲得用于分布式交換的連接:
      Context ctx = new InitialContext();
      DataSource ds = (DataSource) ctx.lookup("jdbc/EmloyeeDB");
      Connection con = ds.getConnection("password","username");
      出于性能的考慮, 用于獲得分布式交換的連接的DataSource對象差不多總是會同時實現(xiàn)緩沖池連接.
      從程序員的角度來看, 獲得普通連接和獲得用于分布式交換的連接之間沒有區(qū)別. 唯一的不同是交換界限(什么時候開始,什么時候結(jié)束)由交換管理器在后臺處理. 應(yīng)用程序不應(yīng)該做任何妨礙交換管理器的事情. 所以程序不能直接調(diào)用commit或者rollback方法, 不能設(shè)置auto-commit模式.
      下面幾行代碼中con是可用于分布式交換的Connection對象, 演示了在con參與分布式交換是不能作的事情:
      con.commit();
      or
      con.rollback();
      or
      con.setAutoCommit(true);
      普通連接默認打開auto-commit模式. 用于分布式交換的連接對象默認關(guān)閉auto-commit模式. 應(yīng)注意的是用于分布式交換的連接也可以用于非分布式交換模式, 交換邊界的限制僅在連接是分布式交換一部分是有效.
      實現(xiàn)支持連接緩沖池的DataSource對象,需要實現(xiàn)ConnectionPoolDataSource對象, 三層構(gòu)架的中間件的連接緩沖模塊將會使用它. 同樣, 實現(xiàn)支持分布式交換的DataSource對象也需要實現(xiàn)XADataSource對象, 中間件的分布式交換構(gòu)件會使用該對象.
      ConnectionPoolDataSource和XADataSource對象對程序員而言是完全透明的, 應(yīng)有驅(qū)動程序廠商提供.
      ★ Rowsets
      RowSet對象是一系列rows的容器. 根據(jù)不通的目的,可以通過多種方式實現(xiàn). RowSet接口和其相關(guān)接口與JDBC 2.0標準擴展的其他部分的差別是它們不是驅(qū)動程序?qū)崿F(xiàn)的一部分. RowSet對象在驅(qū)動程序的上層實現(xiàn),可以被任何人實現(xiàn).
      任何rowset類型都要實現(xiàn)RowSet接口(繼承了ResultSet接口). 所以RowSet對象擁有ResultSet對象的所有功能:可以用getXXX方法取值,用updateXXX方法更新, 移動游標, 執(zhí)行其他相關(guān)任務(wù).
      當(dāng)然rowset也有其新功能.作為JavaBeans組件, RowSet對象提供了方法監(jiān)聽屬性的get/set.其中一個屬性是command串,這個屬性往往是一個查詢,RowSet接口提供可設(shè)置command屬性和執(zhí)行之的方法. 這意味這RowSet對象能夠執(zhí)行自己的檢索命令用查詢結(jié)果填充自己的內(nèi)容. 或者RowSet對象可以實現(xiàn)用來使用任何表格式的數(shù)據(jù)源填充自己, 而不是局限于關(guān)系數(shù)據(jù)庫.
      從數(shù)據(jù)源取得數(shù)據(jù)后, RowSet對象可以斷開于數(shù)據(jù)源的連接,這使得該對象很小(如果數(shù)據(jù)量特別不大). rowset也可以序列化. 所以rowset很小并可以序列化, 一個斷開連接的rowset是傳送數(shù)據(jù)給瘦客戶機的理想工具.
      rowset可以被更新,然后重新連接數(shù)據(jù)源以傳送更新的值. 如果設(shè)置了監(jiān)聽者, 當(dāng)rowset中的游標被移動和內(nèi)容變化時,會通知監(jiān)聽者.
      如, 圖形界面組件(如條圖)可以被注冊為監(jiān)聽者,當(dāng)rowset上有事件發(fā)生將會同志它, 它可以重畫自身反映變化.
      RowSet接口可以有多種實現(xiàn)方式, 依賴于你想做什么.Sun提供了實現(xiàn)的例子CachedRowSet:
      http://developer.java.sun.com/developer/earlyAccess/crs/index.html
      如果您想測試DataSource,一種較為方便的方法是使用支持JDBC2.0和JNDI的Application Server,如Jrun, 如果你已經(jīng)安裝了Jrun,則可以到JMC中配置DataSource了,請看Jrun手冊學(xué)習(xí)使用DataSource的方法。

    posted on 2007-10-22 11:58 Kimi 閱讀(292) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 人妻在线日韩免费视频| 久久国产亚洲精品无码| 国产成人亚洲精品电影| 国产成人精品免费视频软件| 亚洲天堂免费在线| 日韩激情无码免费毛片| 真人无码作爱免费视频| 亚洲日本va午夜中文字幕久久| 男男gay做爽爽的视频免费| 日韩精品电影一区亚洲| 国产无限免费观看黄网站| 亚洲成a人片在线观看无码| 日韩精品无码一区二区三区免费| 亚洲色图古典武侠| 成人a视频片在线观看免费| 理论亚洲区美一区二区三区| 久久精品国产亚洲Aⅴ蜜臀色欲 | 亚洲国产精品VA在线看黑人| 热99RE久久精品这里都是精品免费| 亚洲AV无码国产丝袜在线观看| 色猫咪免费人成网站在线观看| 亚洲婷婷在线视频| 国产一区视频在线免费观看| ww在线观视频免费观看w| 亚洲精品免费视频| 国外成人免费高清激情视频| 亚洲一区二区三区免费| 亚洲无线电影官网| 在线观看免费精品国产| 99在线视频免费观看| 亚洲午夜成激人情在线影院| 国产在线ts人妖免费视频| 在线人成免费视频69国产| 亚洲字幕AV一区二区三区四区| 亚洲国产中文v高清在线观看| 国产精品免费无遮挡无码永久视频 | 亚洲成人福利在线| 亚洲成人国产精品| 114级毛片免费观看| 国产亚洲蜜芽精品久久| 亚洲AV日韩精品久久久久久|