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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

分享如何寫自己的Type3 JDBC 驅(qū)動

2019-11-18 12:37:12
字體:
供稿:網(wǎng)友

  第1部分:應(yīng)用程序連接數(shù)據(jù)的簡單方法
  
  前言

  
  你想不想寫自己的JDBC驅(qū)動,或者是否想把現(xiàn)在的JDBC驅(qū)動轉(zhuǎn)換成Type3的驅(qū)動呢?Type3 的驅(qū)動主要用于無需客戶端設(shè)置的Internet/Intrant應(yīng)用程序中,并且提供靈活的系統(tǒng)治理工具。本文中Nitin Nanda 和 Sunil Kumar描述了JDBC驅(qū)動的架構(gòu)并概略講解了Type3 JDBC驅(qū)動的三層結(jié)構(gòu)。并演示了如何創(chuàng)建自己的Type3 JDBC驅(qū)動。
  
  在java中訪問數(shù)據(jù)庫系統(tǒng)你需要一個(gè)JDBC驅(qū)動。你可以自己寫Type1到Type4的JDBC驅(qū)動,可以是純Java的方式或者使用Java結(jié)合本地接口方法的復(fù)合方式。產(chǎn)品化的方式趨向于利用純Java技術(shù)創(chuàng)建Type3或Type4的驅(qū)動程序。在Internet應(yīng)用程序中訪問數(shù)據(jù)庫的效率和穩(wěn)定性成為了要害因素,這時(shí)Type3 JDBC驅(qū)動顯示出了它的優(yōu)勢。所以,要開發(fā)高效的、易部署的Internet應(yīng)用,你通常需要將現(xiàn)在的Type1或Type2類型的JDBC替換成Type3類型的。
  
  整個(gè)文章分為3個(gè)部分:
  
  1.    應(yīng)用程序連接數(shù)據(jù)庫的簡單方法。
  
  2.    使用自定義的JDBC驅(qū)動編譯、部署、訪問數(shù)據(jù)。
  
  3.    通過高級的日志功能、連接池、預(yù)處理數(shù)據(jù)集增強(qiáng)自定義的JWDriver的性能。
  
  在這三個(gè)部分中,我們首先介紹了我們自己的Type3 JDBC驅(qū)動的結(jié)構(gòu)和設(shè)計(jì)(第一部分),然后講了如何實(shí)現(xiàn)和部署整個(gè)驅(qū)動(第二部分),最后講解了如何在其中增加一些高級特性,比如SQL日志、連接池等(第三部分)。
  
  注重:
  
  在開始之前,也許你可以先看一下Nitin Nanda's的"JDBC Drivers in the Wild",這更有利于你理解JDBC驅(qū)動。
  
  JDBC驅(qū)動的結(jié)構(gòu)
  
  JDBC為通用的數(shù)據(jù)庫訪問提供了一種程序級的接口。在一個(gè)特定的數(shù)據(jù)庫環(huán)境下使用JDBC API你需要一個(gè)JDBC驅(qū)動來完成他們直接的協(xié)調(diào)運(yùn)行。JDBC被分為四種類型或者說層次。每一個(gè)類型都有一個(gè)JDBC實(shí)現(xiàn),以便滿足日益增加的對平臺獨(dú)立性、執(zhí)行效率和可治理性的要求。這四種類型分別是:
  
  Type1:JDBC-ODBC(開方數(shù)據(jù)庫連接)橋。
  
  Type2:本地API,部分的Java驅(qū)動。
  
  Type3:網(wǎng)絡(luò)協(xié)議,完全的Java 驅(qū)動。
  
  Type4:本地協(xié)議,完全的Java驅(qū)動。
  
  所有的JDBC驅(qū)動都要實(shí)現(xiàn)下面四個(gè)JDBC類:Driver、Connection、Statement和ResultSet。包含在java.sql包種DriverManager類用于治理被加載的驅(qū)動。客戶端應(yīng)用程序通過它獲得數(shù)據(jù)庫連接。JDBC的Driver通過下面的方法加載:
  
  Class.forName("com.jw.client.JWDriver");
  
  當(dāng)這個(gè)Driver被加載時(shí)它的staic部分的代碼就會執(zhí)行,通過DriverManager注冊這個(gè)驅(qū)動。現(xiàn)在,只要客戶端應(yīng)用程序通過DriverManger.getConnection()方法,DriverManager就會轉(zhuǎn)而調(diào)用Driver.connect()方法。每一個(gè)JDBC驅(qū)動必須實(shí)現(xiàn)java.sql.Driver接口。所以,JDBC驅(qū)動的Driver.connect方法會首先檢測當(dāng)前的驅(qū)動Url是否正確,然后會通過connet()方法返回一個(gè)Connection對象。
  
  簡單Type3驅(qū)動的結(jié)構(gòu)
  
  為了向你展示Type3驅(qū)動的內(nèi)容結(jié)構(gòu),我創(chuàng)建了一個(gè)自己的Type3JDBC驅(qū)動。我們的Type3驅(qū)動是基于網(wǎng)絡(luò)協(xié)議、完全Java實(shí)現(xiàn)的,它分為3個(gè)層次,同時(shí)向你展示了JDBC是如何通過中間層的網(wǎng)絡(luò)協(xié)議進(jìn)行通信的。中間層服務(wù)講請求傳輸(直接或間接的)給特定的數(shù)據(jù)庫本地連接接口,然后通過這個(gè)接口將請求傳輸?shù)綌?shù)據(jù)庫服務(wù)器。中間層用Java實(shí)現(xiàn),數(shù)據(jù)庫訪問的實(shí)現(xiàn)通過JDBC-ODBC橋。
  
  JDBC Type3 的結(jié)構(gòu)
  
  對于applet,客戶層驅(qū)動文件位于中間層服務(wù)器,并且可以直接下載。在JDBC驅(qū)動種RMI提供網(wǎng)絡(luò)協(xié)議服務(wù),負(fù)責(zé)驅(qū)動的客戶端和服務(wù)端的通信。JDBC-ODBC橋使得JDBC請求可以傳輸?shù)綌?shù)據(jù)庫服務(wù)器。
  
  驅(qū)動的客戶層為客戶端程序提供了標(biāo)準(zhǔn)的JDBC接口,包括實(shí)現(xiàn)了java.sql.Driver接口的Driver類。同時(shí)還包含了JDBC的Connection、Statement、Result接口的實(shí)現(xiàn)。
  
  客戶端應(yīng)用程序,比如applet,可以使用Type3驅(qū)動的客戶層類進(jìn)行開發(fā),因?yàn)樗鼘?shí)現(xiàn)了標(biāo)準(zhǔn)的JDBC接口擁有標(biāo)準(zhǔn)的JDBC功能。客戶層類的Driver在內(nèi)部會維護(hù)與中間層提供的遠(yuǎn)程接口之間的通信。這些遠(yuǎn)程接口提供了客戶端傳輸JDBC請求要用到的基本方法。應(yīng)用程序會調(diào)用已經(jīng)實(shí)現(xiàn)了的Driver中的JDBC方法,隨后這些調(diào)用會通過RMI發(fā)送到中間層。所有Driver類的客戶層通過中間層來治理內(nèi)部的RMI通信。
  
  驅(qū)動的服務(wù)層是一個(gè)RMI服務(wù)器,它通過JDBC-ODBC橋來和數(shù)據(jù)庫進(jìn)行通信。驅(qū)動的服務(wù)層包含4個(gè)遠(yuǎn)程接口以及它們的實(shí)現(xiàn),這些遠(yuǎn)程接口分別為JDBC的Driver、Connection、Statement和Result提供了訪問接口。實(shí)現(xiàn)這些遠(yuǎn)程接口的類會在內(nèi)部維護(hù)JDBC-ODBC的橋驅(qū)動的Connection、Statement和Result對象。當(dāng)客戶層類調(diào)用遠(yuǎn)程接口的時(shí)候,遠(yuǎn)程接口的實(shí)現(xiàn)使用內(nèi)部的JDBC對象與數(shù)據(jù)庫通訊。
  
  現(xiàn)在你已經(jīng)了解了Type3 JDBC驅(qū)動的接口,下面讓我們進(jìn)一步的深入到客戶層和服務(wù)器層中。
  
  JDBC類驅(qū)動
  
  為了實(shí)現(xiàn)Type3 JDBC驅(qū)動,我們必須創(chuàng)建客戶層和中間層。客戶層類位于com.jw.client包中,中間層位于com.jw.server包中,讓我們先來看看客戶層。
  
  客戶層類
  
  客戶層包c(diǎn)om.jw.client中包含下面幾個(gè)類:
  
  com.jw.client.JWDriver類:JDBC驅(qū)動(Driver)的實(shí)現(xiàn)類。
  
  com.jw.client.JWConnection類:JDBC連接(Connection)的實(shí)現(xiàn)類。
  
  com.jw.client.JWStatement類:JDBC表達(dá)式(Statement)的實(shí)現(xiàn)類。
  
  com.jw.client.JWRseultSet類:JDBC結(jié)果集(ResultSet)的實(shí)現(xiàn)。
  
  如所示,它描述了客戶層和中間層Driver和Connection類之間的關(guān)系。
  
  Driver和Connection類
  
  讓我們仔細(xì)的看看JWDriver類的內(nèi)部:
  
  JWDriver類
  
  com.jw.client.JWDriver類實(shí)現(xiàn)了java.sql.Driver接口,它提供了通過DriverManager類注冊自己并創(chuàng)建數(shù)據(jù)庫連接的方法。這個(gè)類實(shí)現(xiàn)了遠(yuǎn)程Driver的封裝以便提供JDBC驅(qū)動接口。在應(yīng)用程序中通過下面的方法調(diào)用可以加載JWDriver:
  
  Class.forName("com.jw.client.JWDriver");
  
  當(dāng)它通過DriverManager類加載后,上面的代碼中forName方法會調(diào)用JWDriver類的static部分的代碼。下面顯示的代碼中的static部分:
  
  static{try{// Register the JWDriver with DriverManagerJWDriver driverInst = new JWDriver();DriverManager.registerDriver(driverInst);System.setSecurityManager(new RMISecurityManager());}...}
  
  JWDriver類同時(shí)還維護(hù)一個(gè)遠(yuǎn)程驅(qū)動的引用,com.jw.server.IremoteDriver,它位于中間層服務(wù)器。遠(yuǎn)程驅(qū)動的引用為JWDriver創(chuàng)建了數(shù)據(jù)庫的連接。所以當(dāng)應(yīng)用程序需要獲得一個(gè)數(shù)據(jù)庫連接的時(shí)候就調(diào)用DriverManager.getConnection()方法,這時(shí)DriverManager的JWDriver.connect()方法會通過遠(yuǎn)程驅(qū)動的引用獲得一個(gè)數(shù)據(jù)庫連接。
  
  簡而言之,JWDriver.connect()方法完成如下超作:
  
      比較客戶端程序傳遞的URL假如是一個(gè)不匹配的URL就返回一個(gè)null。
  
      假如不存在遠(yuǎn)程驅(qū)動引用就通過Naming.lookup()方法創(chuàng)建一個(gè)。JWDriver.connet()方法控制遠(yuǎn)程驅(qū)動來創(chuàng)建數(shù)據(jù)庫連接。:
  
  if(remoteDriver == null){remoteDriver= RemoteDriver)Naming.lookup("rmi://"+serverName+":1099"+"/RemoteDriver");}
  
      創(chuàng)建、使用如上方法創(chuàng)建的數(shù)據(jù)庫連接,并將創(chuàng)建的數(shù)據(jù)庫連接返回給調(diào)用它的應(yīng)用程序。RemoteDriver.getConnetion()方法是中間層JDBC驅(qū)動的遠(yuǎn)程調(diào)用,從中間層獲得的遠(yuǎn)程Connection作為一個(gè)應(yīng)用保存在JWConnection類對象中。JWConnection類可以通過下面的方法獲得:
  
  {IRemoteConnection remoteConInstance =(IRemoteConnection)remoteDriver.getConnection();localConInstance = new JWConnection(remoteConInstance);...return (Connection)localConInstance;}
  
  下面我們一起來仔細(xì)的看看JWConnection類。
  
  JWConnection類
  
  Com.jw.client.JWConnection類實(shí)現(xiàn)了Connection接口,而且它還包含一個(gè)遠(yuǎn)程服務(wù)器IremoteConnection接口的引用。
  
  客戶端程序中的JWDriver.connect方法可以得到JWConnection對象的引用并創(chuàng)建一個(gè)JWConnection對象。這樣客戶端就可以通過JWConnection對象任意的調(diào)用JDBC Connection接口的方法了。JWConnection在內(nèi)部調(diào)用遠(yuǎn)程服務(wù)器的Connection。比如當(dāng)客戶端調(diào)用conn.createStatement()方法時(shí)(conn是一個(gè)JWConnection的引用),其內(nèi)部會調(diào)用一個(gè)RemoteConnection.createConnection()方法,并返回一個(gè)遠(yuǎn)程的Statement引用;JWConnectoin的createStatement方法會創(chuàng)建一個(gè)JWStatement對象;最后一個(gè)JWStatement對象會返回個(gè)客戶端,這個(gè)對象中包含的Statement的引用:
  
  public Statement createStatement() throwsSQLException{try{IRemoteStatement remStmt =(IRemoteStatement) remoteConnection.createStatement();JWStatement localStmtInstance = new JWStatement(remStmt);return (Statement)localStmtInstance;}}
  
  描述了客戶層和中間層中Connection和Statemennt類之間的關(guān)系。
  
  Connection和Statement之間的關(guān)系
  
  下面再讓我們來看看JWStatement類
  
  JWStatement類
  
  com.jw.clent.JWS

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 延川县| 石狮市| 通城县| 仪征市| 安泽县| 收藏| 海阳市| 格尔木市| 无极县| 临朐县| 尤溪县| 商洛市| 三原县| 宣威市| 汉川市| 天镇县| 西华县| 卓资县| 南宫市| 商水县| 抚顺县| 德保县| 江山市| 文水县| 林口县| 株洲市| 瑞安市| 双峰县| 麟游县| 多伦县| 加查县| 留坝县| 登封市| 交口县| 喜德县| 康平县| 康平县| 凤阳县| 泗水县| 重庆市| 响水县|