WEB應(yīng)用與開發(fā)_10JDBC與數(shù)據(jù)庫(kù)(JDBC與SQL語(yǔ)句、存儲(chǔ)過程的應(yīng)用)_第1頁(yè)
WEB應(yīng)用與開發(fā)_10JDBC與數(shù)據(jù)庫(kù)(JDBC與SQL語(yǔ)句、存儲(chǔ)過程的應(yīng)用)_第2頁(yè)
WEB應(yīng)用與開發(fā)_10JDBC與數(shù)據(jù)庫(kù)(JDBC與SQL語(yǔ)句、存儲(chǔ)過程的應(yīng)用)_第3頁(yè)
WEB應(yīng)用與開發(fā)_10JDBC與數(shù)據(jù)庫(kù)(JDBC與SQL語(yǔ)句、存儲(chǔ)過程的應(yīng)用)_第4頁(yè)
WEB應(yīng)用與開發(fā)_10JDBC與數(shù)據(jù)庫(kù)(JDBC與SQL語(yǔ)句、存儲(chǔ)過程的應(yīng)用)_第5頁(yè)
已閱讀5頁(yè),還剩62頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、課題課題JDBC與數(shù)據(jù)庫(kù)(與數(shù)據(jù)庫(kù)(JDBC與與SQL語(yǔ)句、存語(yǔ)句、存儲(chǔ)過程的應(yīng)用)儲(chǔ)過程的應(yīng)用) 目的要求目的要求 掌握掌握J(rèn)DBC存取各種不同數(shù)據(jù)庫(kù)的方法存取各種不同數(shù)據(jù)庫(kù)的方法 教學(xué)重點(diǎn)掌握教學(xué)重點(diǎn)掌握J(rèn)DBC與不同數(shù)據(jù)庫(kù)的連接字符串、與不同數(shù)據(jù)庫(kù)的連接字符串、連接池連接池教學(xué)難點(diǎn)教學(xué)難點(diǎn) JSP如何存取存儲(chǔ)過程中輸入?yún)?shù)、輸出如何存取存儲(chǔ)過程中輸入?yún)?shù)、輸出參數(shù)、輸入輸出參數(shù)、輸入輸出參數(shù)參數(shù)教學(xué)課時(shí)教學(xué)課時(shí) 4(含(含2課時(shí)上機(jī))課時(shí)上機(jī))教學(xué)方法教學(xué)方法 講解、示例與啟發(fā)式教學(xué)相結(jié)合講解、示例與啟發(fā)式教學(xué)相結(jié)合教學(xué)內(nèi)容和步驟教學(xué)內(nèi)容和步驟10.1 JDBC與數(shù)據(jù)庫(kù)編程與數(shù)據(jù)庫(kù)編程1

2、0.1.1 JDBC的的Driver可分為以下四種類型可分為以下四種類型(1)JDBC-ODBC Bridge和和ODBC Driver這種驅(qū)動(dòng)器器通過這種驅(qū)動(dòng)器器通過ODBC驅(qū)動(dòng)器提供數(shù)據(jù)庫(kù)連接。使用這驅(qū)動(dòng)器提供數(shù)據(jù)庫(kù)連接。使用這種驅(qū)動(dòng)器,要求每一臺(tái)客戶機(jī)都裝入種驅(qū)動(dòng)器,要求每一臺(tái)客戶機(jī)都裝入ODBC的驅(qū)動(dòng)器。的驅(qū)動(dòng)器。(2)Native-API partly-Java Driver這種驅(qū)動(dòng)器將這種驅(qū)動(dòng)器將JDBC指令轉(zhuǎn)化成所連接使用的指令轉(zhuǎn)化成所連接使用的DBMS的操的操作形式。各客戶機(jī)使用的數(shù)據(jù)庫(kù)可能是作形式。各客戶機(jī)使用的數(shù)據(jù)庫(kù)可能是Oracle,可能是,可能是Sybase,也可能是,

3、也可能是Access,都需要在客戶機(jī)上裝有相應(yīng),都需要在客戶機(jī)上裝有相應(yīng)DBMS的驅(qū)動(dòng)程序。的驅(qū)動(dòng)程序。(3)JDBC-Net All-Java Driver這種驅(qū)動(dòng)器將這種驅(qū)動(dòng)器將JDBC指令轉(zhuǎn)化成獨(dú)立于指令轉(zhuǎn)化成獨(dú)立于DBMS的的網(wǎng)絡(luò)協(xié)議形式,再由服務(wù)器轉(zhuǎn)化為特定網(wǎng)絡(luò)協(xié)議形式,再由服務(wù)器轉(zhuǎn)化為特定DBMS的協(xié)的協(xié)議形式。有關(guān)議形式。有關(guān)DBMS的協(xié)議由各數(shù)據(jù)庫(kù)廠商決定。的協(xié)議由各數(shù)據(jù)庫(kù)廠商決定。這種驅(qū)動(dòng)器可以聯(lián)接到不同的數(shù)據(jù)庫(kù)上,最為靈活。這種驅(qū)動(dòng)器可以聯(lián)接到不同的數(shù)據(jù)庫(kù)上,最為靈活。目前一些廠商已經(jīng)開始添加目前一些廠商已經(jīng)開始添加JDBC的這種驅(qū)動(dòng)器到他的這種驅(qū)動(dòng)器到他們已有的數(shù)據(jù)庫(kù)中介

4、產(chǎn)品中。要注意的是,為了支們已有的數(shù)據(jù)庫(kù)中介產(chǎn)品中。要注意的是,為了支持廣域網(wǎng)存取,需要增加有關(guān)安全性的措施,如防持廣域網(wǎng)存取,需要增加有關(guān)安全性的措施,如防火墻等等?;饓Φ鹊取?4)Native-protocol All-Java Driver這種驅(qū)動(dòng)器將這種驅(qū)動(dòng)器將JDBC指令轉(zhuǎn)化成網(wǎng)絡(luò)協(xié)議指令轉(zhuǎn)化成網(wǎng)絡(luò)協(xié)議后不再轉(zhuǎn)換,由后不再轉(zhuǎn)換,由DBMS直接使用。相當(dāng)于客戶機(jī)直直接使用。相當(dāng)于客戶機(jī)直接與服務(wù)器聯(lián)系,對(duì)局域網(wǎng)適用。接與服務(wù)器聯(lián)系,對(duì)局域網(wǎng)適用。 在這四種驅(qū)動(dòng)器中,后兩類在這四種驅(qū)動(dòng)器中,后兩類“純純Java”(All-Java)的驅(qū)動(dòng)器效率更高,也更具有通用性。但目的驅(qū)動(dòng)器效率更高,

5、也更具有通用性。但目前第一、第二類驅(qū)動(dòng)器比較容易獲得,使用也較普前第一、第二類驅(qū)動(dòng)器比較容易獲得,使用也較普遍。遍。10.1.2 關(guān)于關(guān)于JDBC Url語(yǔ)法如下:語(yǔ)法如下: jdbc:-驅(qū)動(dòng)程序名稱或數(shù)據(jù)庫(kù)連接機(jī)制,子協(xié)議名驅(qū)動(dòng)程序名稱或數(shù)據(jù)庫(kù)連接機(jī)制,子協(xié)議名稱的典型例子就是稱的典型例子就是ODBC ,如:如:jdbc:odbc:fff-一種標(biāo)識(shí)數(shù)據(jù)庫(kù)的方法。子名稱可以依據(jù)不一種標(biāo)識(shí)數(shù)據(jù)庫(kù)的方法。子名稱可以依據(jù)不同的子協(xié)議而發(fā)生變化同的子協(xié)議而發(fā)生變化如:如:jdbc:dbnet/womat:356/fff ODBC子協(xié)議子協(xié)議:Jdbc:odbc:;=如:如: jdbc:odbc:sql

6、conn:UID=sa;PWD=ww10.2 JDBC編程編程10.2.1 程序基本結(jié)構(gòu)程序基本結(jié)構(gòu) 一般的一般的JDBC程序都完成三項(xiàng)功能:與數(shù)據(jù)庫(kù)建立連接;程序都完成三項(xiàng)功能:與數(shù)據(jù)庫(kù)建立連接;傳送傳送SQL 聲明以及對(duì)返回結(jié)果進(jìn)行處理。下面我們通過聲明以及對(duì)返回結(jié)果進(jìn)行處理。下面我們通過一個(gè)具體例子說明這三項(xiàng)功能的實(shí)現(xiàn)過程。一個(gè)具體例子說明這三項(xiàng)功能的實(shí)現(xiàn)過程。例例1: Creage.java給出了一個(gè)簡(jiǎn)單的給出了一個(gè)簡(jiǎn)單的JDBC程序,此程序程序,此程序執(zhí)行后創(chuàng)建一張名為執(zhí)行后創(chuàng)建一張名為testTable的表,表中包括兩個(gè)域,的表,表中包括兩個(gè)域,域名分別為域名分別為id和和name

7、。import .URL;import java.sql.*;class Createpublic static void main (String args)String url=jdbc:odbc:demo;String query=CREATE TABLE testTable + (id INT,name CHAR(10); try/下載下載jdbc-odbc bridge 驅(qū)動(dòng)器驅(qū)動(dòng)器 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);/關(guān)于此句參見下面關(guān)于此句參見下面Cyclone的注釋的注釋/與驅(qū)動(dòng)器建立連接與驅(qū)動(dòng)器建立連接 ,這里可使用不同的

8、特定驅(qū)動(dòng),如這里可使用不同的特定驅(qū)動(dòng),如jdbcfororacle或或jdbcforsqlserverConnection con=DriverManager.getConnection(url,user,password);/創(chuàng)建一個(gè)創(chuàng)建一個(gè)Statement對(duì)象對(duì)象Statement stmt=con.createStatement();/執(zhí)行執(zhí)行SQL聲明聲明stmt.executeUpdate(query);System.out.println(Create successfully!); /關(guān)閉關(guān)閉 stmstmt.close();/關(guān)閉連接關(guān)閉連接con.close();catch

9、(SQLException ex)/SQL異常信息異常信息System.out.println(n*SQLException caught *n);while(ex!=null)System.out.println(SQLState:+ex.getSQLState();System.out.println(Message:+ex.getMessage();System.out.println(Vendor:+ex.getErrorCode();ex=ex.getNextException();System.out.println();catch(java.lang.Exception ex)e

10、x.printStackTrace();22 Statement類及其子類類及其子類1)Statement接口接口Statement stmt=con.createStatement();/執(zhí)行執(zhí)行SQL聲明聲明int count1=stmt.executeUpdate(INSERT INTO testTable(id,name) VALUES(1,wu);int count2=stmt.executeUpdate(INSERT INTO testTable(id,name) VALUES(2,wang);2)PreparedStatement接口接口String data=5,xu,6,ya

11、n;PreparedStatement pstmt=con.prepareStatement(INSERT INTO testTable (id,name) VALUES(?,?);/參數(shù)賦值,執(zhí)行參數(shù)賦值,執(zhí)行SQL聲明聲明for (int i=0;idata.length;i+) pstmt.setInt(1,Integer.parseInt(datai0); pstmt.setString(2,datai1); pstmt.executeUpdate(); 3)CallableStatement接口接口 CallableStatement cstmt=con.prepareCall(ca

12、ll Search(?);/參數(shù)賦值參數(shù)賦值cstmt.setInt(1,934678);/執(zhí)行儲(chǔ)存過程。執(zhí)行儲(chǔ)存過程。cstmt.execute();2.3 結(jié)果集結(jié)果集ResultSet及及ResultSetMetaDataString query = SELECT * FROM testTable;Statement stmt=con.createStatement();/發(fā)出查詢要求,獲得結(jié)果集發(fā)出查詢要求,獲得結(jié)果集ResultSet rs=stmt.executeQuery(query);/顯示結(jié)果集各行各列顯示結(jié)果集各行各列System.out.println(The detai

13、l of testTable is:);ResultSetMetaData rsmd=rs.getMetaData();/獲得結(jié)果集列數(shù)獲得結(jié)果集列數(shù)in numCols=rsmd.getColumnCount();/顯示列標(biāo)題顯示列標(biāo)題for(int i=1;i1) System.out.print(,);System.out.print(rsmd.getColumnLabel(i);System.out.println();/顯示結(jié)果集信息顯示結(jié)果集信息while(rs.next()/顯示一行顯示一行for(int i=1;i1) System.out.print(,);System.ou

14、t.print(rs.getString(i);2.4 DatabaseMetaDataDatabaseMetaData dma = con.getMetaData();/驅(qū)動(dòng)器和驅(qū)動(dòng)器和URL信息信息System.out.println(nConnected to + dma.getURL();System.out.println(Driver + dma.getDriverName();System.out.println(Version + dma.getDriverVersion() /數(shù)據(jù)庫(kù)信息數(shù)據(jù)庫(kù)信息System.out.println(nDataBase name: + dma

15、.getDatabaseProductName()+dma.getDatabaseProductVersion();System.out.println(DataBase supports SQL keywords:nt + dma.getSQLKeywords();/數(shù)據(jù)庫(kù)功能信息函數(shù)數(shù)據(jù)庫(kù)功能信息函數(shù)dma.supportsANSI92EntryLevelSQL()dma.supportsANSI92FullSQL()dma.supportsStoredProcedures()10.2.2 JDBC數(shù)據(jù)類型及類型轉(zhuǎn)換數(shù)據(jù)類型及類型轉(zhuǎn)換 JDBC的數(shù)據(jù)類型的數(shù)據(jù)類型JDBC的的sql包中除了

16、與數(shù)據(jù)庫(kù)連接有關(guān)的包中除了與數(shù)據(jù)庫(kù)連接有關(guān)的抽象接口及與驅(qū)動(dòng)器有關(guān)的抽象接口及與驅(qū)動(dòng)器有關(guān)的DriverManager、DriverPropertyInfo等類型外,還定義了若干數(shù)等類型外,還定義了若干數(shù)據(jù)類,用以代表數(shù)據(jù)庫(kù)中可能用到的據(jù)類,用以代表數(shù)據(jù)庫(kù)中可能用到的SQL類型。類型。下面我們就對(duì)它們逐一進(jìn)行簡(jiǎn)略介紹。下面我們就對(duì)它們逐一進(jìn)行簡(jiǎn)略介紹。 sql.Datesql包中的日期類包中的日期類Date是是util包中包中Date類的子類的子類,實(shí)際上也是類,實(shí)際上也是util.Date類的子集。它只處理年月類的子集。它只處理年月日,而忽略小時(shí)和分秒,用以代表日,而忽略小時(shí)和分秒,用以代表

17、SQL的的DATE信息。信息。Date類的構(gòu)造方法為:類的構(gòu)造方法為:public Date(int year, int mouth, int day)其中參數(shù)格式同其中參數(shù)格式同util.Date類的構(gòu)造方法一樣,年類的構(gòu)造方法一樣,年參數(shù)為所需設(shè)定的年份減去參數(shù)為所需設(shè)定的年份減去1900所得的整數(shù)值,月所得的整數(shù)值,月參數(shù)為參數(shù)為0至至11,日參數(shù)為,日參數(shù)為1至至31。如。如1998年年1月月23日日所對(duì)應(yīng)創(chuàng)建日期類的方法調(diào)用為:所對(duì)應(yīng)創(chuàng)建日期類的方法調(diào)用為:Date d=new Date(98,0,23);Date類還提供兩個(gè)與類還提供兩個(gè)與String類互類互相轉(zhuǎn)換的方法,分別是:

18、相轉(zhuǎn)換的方法,分別是:public static Date valueOf(String s)將字符串類參數(shù)轉(zhuǎn)換為日期類對(duì)象。將字符串類參數(shù)轉(zhuǎn)換為日期類對(duì)象。其中其中String類參數(shù)類參數(shù)S的格式為的格式為“年年-月月-日日”,加加“1997-04-12”。public String toString()將日期類對(duì)象轉(zhuǎn)換為將日期類對(duì)象轉(zhuǎn)換為String類對(duì)象表類對(duì)象表示,同樣采用示,同樣采用“年年-月月-日日”的格式。的格式。 sql.Time 該類是該類是util.Date類的子類,也是它的一個(gè)子集。類的子類,也是它的一個(gè)子集。在在Time類里,只處理小時(shí)和分秒,代表類里,只處理小時(shí)和分秒

19、,代表SQL的的TIME類型。它與類型。它與sql.Date合起來(lái)才表示完整的合起來(lái)才表示完整的util.Date類類信息。信息。 Time類的構(gòu)造方法為:類的構(gòu)造方法為: public Time(int hour,int minute,int second)其中小時(shí)參數(shù)值為其中小時(shí)參數(shù)值為0至至23,分秒?yún)?shù)取值均為,分秒?yún)?shù)取值均為0至至59。 與與sql.Date一樣,一樣,Time類也定義了兩個(gè)與類也定義了兩個(gè)與String類互相轉(zhuǎn)換的函數(shù)類互相轉(zhuǎn)換的函數(shù)ValueOf和和String。不同的。不同的是是String類對(duì)象的格式為類對(duì)象的格式為“小時(shí):分:秒小時(shí):分:秒”,如,如“12

20、:26:06”。 sql.Timestamp 這個(gè)類也是這個(gè)類也是util.Date類的子類,其中除了包含年月日、類的子類,其中除了包含年月日、小時(shí)和分秒和信息之外,還加入了納秒信息小時(shí)和分秒和信息之外,還加入了納秒信息(nanosecond),1納秒即納秒即1毫微秒。毫微秒。Timestamp類用來(lái)代表類用來(lái)代表SQL時(shí)間戳?xí)r間戳(Timestamp)類型信息。類型信息。Timestamp類的構(gòu)造方法為:類的構(gòu)造方法為:public Timestamp(int year, int mouth, int date, int hour, int minute, int second, int n

21、ano)其中納秒?yún)?shù)的取其中納秒?yún)?shù)的取值從值從0至至999,999,999,其余各參數(shù)同前。,其余各參數(shù)同前。Timestamp類特別定義了設(shè)置和獲得納秒信息的方法,類特別定義了設(shè)置和獲得納秒信息的方法,分別是分別是public getnanos()獲取時(shí)間戳的納秒部分獲取時(shí)間戳的納秒部分public void setNanos(int n)以給定數(shù)值設(shè)置時(shí)間戳的納秒部分以給定數(shù)值設(shè)置時(shí)間戳的納秒部分 sql.TypesTypes類是類是Object類的直接子類。在這個(gè)類類的直接子類。在這個(gè)類中以靜態(tài)常量的形式定義了可使用的中以靜態(tài)常量的形式定義了可使用的SQL的數(shù)值的數(shù)值類型。所有這些類型

22、常量都以前綴類型。所有這些類型常量都以前綴public final static int的形式標(biāo)明是公有靜態(tài)的形式標(biāo)明是公有靜態(tài)整數(shù),且不可改動(dòng)。具體的類型名和含義如表整數(shù),且不可改動(dòng)。具體的類型名和含義如表11.1所示。其中所示。其中OTHER用來(lái)代表數(shù)據(jù)庫(kù)定義的特用來(lái)代表數(shù)據(jù)庫(kù)定義的特殊數(shù)據(jù),可以用殊數(shù)據(jù),可以用getObject或或setObject方法將其方法將其映射為一個(gè)映射為一個(gè)Java的的Object對(duì)象。對(duì)象。表表 1 Types中定義的中定義的SQL類型類型 類型名含義BIBIGIGINTNT長(zhǎng)整型數(shù)BINARY二進(jìn)制數(shù)BIT比特?cái)?shù)CHAR字符型DATE日期型DECIMAL十

23、進(jìn)制數(shù)DOUBLE雙精度數(shù)FLOAT浮點(diǎn)數(shù)INTEGER整數(shù)LONGVARBINARY可變長(zhǎng)型二進(jìn)制數(shù)LONGVARCHAR可變長(zhǎng)型字符NULL空類型NUMERIC數(shù)值型OTHER其他類型REAL實(shí)數(shù)SMALLINT短整型TIME時(shí)間類型TIMESTAMP時(shí)間戳類型TINYINT微整型VARBINARY可變二進(jìn)制數(shù)VARCHAR可變字符型 SQL與與Java由于由于SQL數(shù)據(jù)類型與數(shù)據(jù)類型與Java的數(shù)據(jù)類型不一致,的數(shù)據(jù)類型不一致,因而在使用因而在使用Java類型的應(yīng)用程序與使用類型的應(yīng)用程序與使用SQL類型的數(shù)類型的數(shù)據(jù)庫(kù)之間,需要某種讀寫類型轉(zhuǎn)換機(jī)制。實(shí)際上我們據(jù)庫(kù)之間,需要某種讀寫類型

24、轉(zhuǎn)換機(jī)制。實(shí)際上我們前面介紹的前面介紹的ResultSet類的類的“get”系列方法,系列方法,Statement及其子類的及其子類的“set“系列方法和系列方法和registerOutParameter方法,都是這一轉(zhuǎn)換機(jī)制的組方法,都是這一轉(zhuǎn)換機(jī)制的組成部分。成部分。需要進(jìn)行的讀寫轉(zhuǎn)換包括下面情況:需要進(jìn)行的讀寫轉(zhuǎn)換包括下面情況:從數(shù)據(jù)庫(kù)中讀取數(shù)值后,存放在從數(shù)據(jù)庫(kù)中讀取數(shù)值后,存放在ResultSet對(duì)對(duì)象中的是象中的是SQL類型的數(shù)據(jù)。而調(diào)用類型的數(shù)據(jù)。而調(diào)用“get”系列方法時(shí),系列方法時(shí),JDBC才將才將SQL類型轉(zhuǎn)換為指定的類型轉(zhuǎn)換為指定的Java類型。在一般類型。在一般情形下,

25、情形下,SQL類型相對(duì)應(yīng)的類型相對(duì)應(yīng)的Java類型如表類型如表11-2所示。所示。 SQL與與Java由于由于SQL數(shù)據(jù)類型與數(shù)據(jù)類型與Java的數(shù)據(jù)類型不一致,的數(shù)據(jù)類型不一致,因而在使用因而在使用Java類型的應(yīng)用程序與使用類型的應(yīng)用程序與使用SQL類型的數(shù)據(jù)類型的數(shù)據(jù)庫(kù)之間,需要某種讀寫類型轉(zhuǎn)換機(jī)制。實(shí)際上我們前面庫(kù)之間,需要某種讀寫類型轉(zhuǎn)換機(jī)制。實(shí)際上我們前面介紹的介紹的ResultSet類的類的“get”系列方法,系列方法,Statement及其及其子類的子類的“set“系列方法和系列方法和registerOutParameter方法,方法,都是這一轉(zhuǎn)換機(jī)制的組成部分。都是這一轉(zhuǎn)換機(jī)

26、制的組成部分。需要進(jìn)行的讀寫轉(zhuǎn)換包括下面情況:需要進(jìn)行的讀寫轉(zhuǎn)換包括下面情況:從數(shù)據(jù)庫(kù)中讀取數(shù)值后,存放在從數(shù)據(jù)庫(kù)中讀取數(shù)值后,存放在ResultSet對(duì)象對(duì)象中的是中的是SQL類型的數(shù)據(jù)。而調(diào)用類型的數(shù)據(jù)。而調(diào)用“get”系列方法時(shí),系列方法時(shí),JDBC才將才將SQL類型轉(zhuǎn)換為指定的類型轉(zhuǎn)換為指定的Java類型。在一般情類型。在一般情形下,形下,SQL類型相對(duì)應(yīng)的類型相對(duì)應(yīng)的Java類型如表類型如表11-2所示。所示。表表2 SQL類型一般所對(duì)應(yīng)的類型一般所對(duì)應(yīng)的Java類型類型SQL typeJava typeCHARjava.lang.StringVARCHARjava.lang.Str

27、ingLONGVARCHARjava.lang.StringNUMERICjava.lang.BignumDECIMALjava.lang.Bignum 字符類型字符類型JDBC JDBC 字符串?dāng)?shù)據(jù)類型為字符串?dāng)?shù)據(jù)類型為 CHARCHAR、VARCHAR VARCHAR 和和 LONGVARCHARLONGVARCHAR。類型類型 說明說明 Fixed-lengthSQL Server charchar 和 ncharnchar 數(shù)據(jù)類型直接映射到 JDBC CHARCHAR 類型。這些都是在列具有 SET ANSI_PADDING ON 的情況下,具有由服務(wù)器提供的填充的固定長(zhǎng)度的類型。對(duì)

28、于 ncharnchar,填充始終是打開的,但對(duì)于 charchar,在未填充服務(wù)器字符列的情況下,JDBC 驅(qū)動(dòng)程序?qū)⑻砑犹畛?。Variable-lengthSQL Server varchar SQL Server varchar 和和 nvarchar nvarchar 類型直接映射到類型直接映射到 JDBC VARCHAR JDBC VARCHAR 類類型。型。LongSQL Server text SQL Server text 和和 ntext ntext 類型類型映射到映射到 JDBC LONGVARCHAR JDBC LONGVARCHAR 類型。類型。對(duì)于對(duì)于 SQL Ser

29、ver 2005 SQL Server 2005 來(lái)說,這來(lái)說,這些類型已過時(shí),因此應(yīng)改用大值類些類型已過時(shí),因此應(yīng)改用大值類型。型。針對(duì)針對(duì) text text 和和 ntext ntext 服務(wù)器列使服務(wù)器列使用用 update update 和和 updateObject (int, updateObject (int, java.lang.Object)java.lang.Object) 方法時(shí)將失敗方法時(shí)將失敗。然而,對(duì)于。然而,對(duì)于 text text 和和 ntext ntext 服服務(wù)器列,支持將務(wù)器列,支持將 setObjectsetObject 方法方法用于指定的字符轉(zhuǎn)換類

30、型。用于指定的字符轉(zhuǎn)換類型。 二進(jìn)制字符串類型二進(jìn)制字符串類型JDBC 二進(jìn)制字符串類型為二進(jìn)制字符串類型為 BINARY、VARBINARY 和和 LONGVARBINARY。類型類型 說明說明 固定長(zhǎng)度固定長(zhǎng)度SQL Server binary SQL Server binary 類型直接映射類型直接映射到到 JDBC BINARY JDBC BINARY 類型。這是在列具類型。這是在列具有有 SET ANSI_PADDING ON SET ANSI_PADDING ON 的情況下,的情況下,具有由服務(wù)器提供填充的固定長(zhǎng)度具有由服務(wù)器提供填充的固定長(zhǎng)度類型。沒有填充服務(wù)器類型。沒有填充服務(wù)

31、器 char char 列時(shí),列時(shí),JDBC JDBC 驅(qū)動(dòng)程序會(huì)添加填充。驅(qū)動(dòng)程序會(huì)添加填充。SQL Server timestamp SQL Server timestamp 類型是具有類型是具有 8 8 個(gè)字節(jié)的固定長(zhǎng)度的個(gè)字節(jié)的固定長(zhǎng)度的 JDBC JDBC BINARY BINARY 類型。類型??勺冮L(zhǎng)度可變長(zhǎng)度SQL Server varbinary SQL Server varbinary 類型映射到類型映射到 JDBC VARBINARY JDBC VARBINARY 類型。類型。LongLongSQL Server image SQL Server image 類型映射到類型

32、映射到 JDBC LONGVARBINARY JDBC LONGVARBINARY 類型。對(duì)于類型。對(duì)于 SQL Server 2005 SQL Server 2005 來(lái)說,該類型已來(lái)說,該類型已過時(shí),因此應(yīng)改用大值類型。過時(shí),因此應(yīng)改用大值類型。SQL Server 2005 SQL Server 2005 中的中的 udt udt 類型作類型作為為 LONGBINARY LONGBINARY 類型映射到類型映射到 JDBCJDBC。 精確數(shù)字類型精確數(shù)字類型JDBC JDBC 精確數(shù)字類型直接映射到其對(duì)應(yīng)的精確數(shù)字類型直接映射到其對(duì)應(yīng)的 SQL ServerSQL Server 類型。類

33、型類型 說明說明 BITBITJDBC BIT JDBC BIT 類型表示可能是類型表示可能是 0 0 或或 1 1 的單個(gè)位。此類型映射到的單個(gè)位。此類型映射到 SQL SQL Server bit Server bit 類型。類型。TINYINTTINYINTJDBC TINYINT JDBC TINYINT 類型表示單個(gè)類型表示單個(gè)字節(jié)。此類型映射到字節(jié)。此類型映射到 SQL SQL Server tinyint Server tinyint 類型。類型。SMALLINTSMALLINTJDBC SMALLINT JDBC SMALLINT 類型表示有符類型表示有符號(hào)的號(hào)的 16 16

34、位整數(shù)。此類型映射位整數(shù)。此類型映射到到 SQL Server smallint SQL Server smallint 類類型。型。INTEGERINTEGERJDBC INTEGER JDBC INTEGER 類型表示有符號(hào)的類型表示有符號(hào)的 32 32 位整數(shù)。此類型映射到位整數(shù)。此類型映射到 SQL SQL Server int Server int 類型。類型。BIGINTBIGINTJDBC BIGINT JDBC BIGINT 類型表示有符號(hào)的類型表示有符號(hào)的 64 64 位整數(shù)。此類型映射到位整數(shù)。此類型映射到 SQL SQL Server bigint Server bigi

35、nt 類型。類型。NUMERICNUMERICJDBC NUMERIC JDBC NUMERIC 類型表示固定精度類型表示固定精度的十進(jìn)制值,它可存放相同精度的的十進(jìn)制值,它可存放相同精度的值。值。NUMERIC NUMERIC 類型映射到類型映射到 SQL SQL Server numeric Server numeric 類型。類型。DECIMALDECIMALJDBC DECIMAL JDBC DECIMAL 類型表示固定精度類型表示固定精度的十進(jìn)制值,它可存放至少具有指的十進(jìn)制值,它可存放至少具有指定精度的值。定精度的值。DECIMAL DECIMAL 類型映射到類型映射到 SQL S

36、erver decimal SQL Server decimal 類型。類型。JDBC DECIMAL JDBC DECIMAL 類型還映射到類型還映射到 SQL SQL Server money Server money 和和 smallmoney smallmoney 類類型,這些類型是特定的固定精度的型,這些類型是特定的固定精度的十進(jìn)制類型,分別以十進(jìn)制類型,分別以 8 8 個(gè)字節(jié)和個(gè)字節(jié)和 4 4 個(gè)字節(jié)進(jìn)行存儲(chǔ)。個(gè)字節(jié)進(jìn)行存儲(chǔ)。 近似數(shù)字類型JDBC 近似數(shù)值數(shù)據(jù)類型為 REAL、DOUBLE 和 FLOAT。類型類型 說明說明 REALJDBC REALREAL 類型具有 7 位精

37、度(單精度)并直接映射到 SQL Server realreal 類型。DOUBLEJDBC DOUBLE JDBC DOUBLE 類型具有類型具有 15 15 位精位精度(雙精度)并直接映射到度(雙精度)并直接映射到 SQL SQL Server float Server float 類型。類型。JDBC JDBC FLOAT FLOAT 類型是類型是 DOUBLE DOUBLE 的同義詞。的同義詞。由于由于 FLOAT FLOAT 與與 DOUBLE DOUBLE 之間可之間可能存在沖突,因此能存在沖突,因此 DOUBLE DOUBLE 為首為首選類型。選類型。 日期時(shí)間類型日期時(shí)間類型J

38、DBC TIMESTAMP 類型映射到類型映射到 SQL Server datetime 和和 smalldatetime 類型。類型。datetime 類型以兩個(gè)類型以兩個(gè) 4 字節(jié)整數(shù)進(jìn)行存儲(chǔ)。字節(jié)整數(shù)進(jìn)行存儲(chǔ)。smalldatetime 類型可存放相同的信息(日期類型可存放相同的信息(日期和時(shí)間),但精度較低,為兩個(gè)和時(shí)間),但精度較低,為兩個(gè) 2 字節(jié)的小整字節(jié)的小整數(shù)。數(shù)。10.3 JDBC與數(shù)據(jù)庫(kù)的連接字符串與數(shù)據(jù)庫(kù)的連接字符串 MySQL(http:/)mm.mysql-2.0.2-bin.jar Class.forName( org.gjt.mm.mysql.Driver );

39、 cn= DriverManager.getConnection( jdbc:mysql:/MyDbComputerNameOrIP:3306/myDatabaseName, sUsr, sPwd ); Oracle(http:/ Class.forName( oracle.jdbc.driver.OracleDriver ); cn= DriverManager.getConnection( jdbc:oracle:thin:MyDbComputerNameOrIP:1521:ORCL, sUsr, sPwd ); Sybase(http:/)jconn2.jar Class.forName

40、( com.sybase.jdbc.SybDriver ); cn = DriverManager.getConnection( jdbc:sybase:Tds:MyDbComputerNameOrIP:2638, sUsr, sPwd ); /(Default-Username/Password: dba/sql) Microsoft SQLServer(http:/) Class.forName( com.microsoft.jdbc.sqlserver.SQLServerDriver ); cn= DriverManager.getConnection( jdbc:microsoft:s

41、qlserver:/MyDbComputerNameOrIP:1433;databaseName=master, sUsr, sPwd ); ODBC Class.forName( sun.jdbc.odbc.JdbcOdbcDriver ); Connection cn = DriverManager.getConnection( jdbc:odbc: + sDsn, sUsr, sPwd ); informix Class.forName(rmix.jdbc.IfxDriver).newInstance(); String url =jdbc:informix-sqli:/

42、9:1533/testDB:INFORMIXSERVER=myserver; user=testuser;password=testpassword; sybaseClass.forName( com.sybase.jdbc.SybDriver ) url=jdbc:sybase:Tds::2638/asademo; SybConnection connection= (SybConnection)DriverManager.getConnection(url,dba,sql); 例例2: queryBook.jsp圖書信息瀏覽圖書信息瀏覽ID號(hào)號(hào) 書名

43、書名 出版社出版社 價(jià)格價(jià)格%Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver).newInstance();Connection con=java.sql.DriverManager.getConnection(jdbc:microsoft:sqlserver:/:1433;DatabaseName=jspdb,sa,);Statement stmt=con.createStatement();ResultSet rst=stmt.executeQuery(select * from book;);whil

44、e(rst.next()out.println();out.println(+rst.getString(bkld)+);out.println(+rst.getString(bkName)+);out.println(+rst.getString(bkPublisher)+);out.println(+rst.getFloat(bkPrice)+元元+);out.println();rst.close();stmt.close();con.close();%10.4 連接池連接池 連接池原理連接池原理 連接池連接池技術(shù)的核心思想是:連接復(fù)用,通過技術(shù)的核心思想是:連接復(fù)用,通過建立一個(gè)數(shù)據(jù)庫(kù)

45、連接池以及一套連接使用、分配、建立一個(gè)數(shù)據(jù)庫(kù)連接池以及一套連接使用、分配、管理策略,使得該連接池中的連接可以得到高效、管理策略,使得該連接池中的連接可以得到高效、安全的復(fù)用,避免了數(shù)據(jù)庫(kù)連接頻繁建立、關(guān)閉安全的復(fù)用,避免了數(shù)據(jù)庫(kù)連接頻繁建立、關(guān)閉的開銷。另外,由于對(duì)的開銷。另外,由于對(duì)JDBC中的原始連接進(jìn)行中的原始連接進(jìn)行了封裝,從而方便了數(shù)據(jù)庫(kù)應(yīng)用對(duì)于連接的使用了封裝,從而方便了數(shù)據(jù)庫(kù)應(yīng)用對(duì)于連接的使用(特別是對(duì)于事務(wù)處理),提高了開發(fā)效率,也(特別是對(duì)于事務(wù)處理),提高了開發(fā)效率,也正是因?yàn)檫@個(gè)封裝層的存在,隔離了應(yīng)用的本身正是因?yàn)檫@個(gè)封裝層的存在,隔離了應(yīng)用的本身的處理邏輯和具體數(shù)據(jù)庫(kù)

46、訪問邏輯,使應(yīng)用本身的處理邏輯和具體數(shù)據(jù)庫(kù)訪問邏輯,使應(yīng)用本身的復(fù)用成為可能。連接池主要由三部分組成:連的復(fù)用成為可能。連接池主要由三部分組成:連接池的建立、連接池中連接的使用管理、連接池接池的建立、連接池中連接的使用管理、連接池的關(guān)閉。的關(guān)閉。 連接池的管理連接池的管理 連接池管理策略是連接池機(jī)制的核心。當(dāng)連接池建連接池管理策略是連接池機(jī)制的核心。當(dāng)連接池建立后,如何對(duì)連接池中的連接進(jìn)行管理,解決好連接立后,如何對(duì)連接池中的連接進(jìn)行管理,解決好連接池內(nèi)連接的分配和釋放,對(duì)系統(tǒng)的性能有很大的影響。池內(nèi)連接的分配和釋放,對(duì)系統(tǒng)的性能有很大的影響。連接的合理分配、釋放可提高連接的復(fù)用,降低了系連接

47、的合理分配、釋放可提高連接的復(fù)用,降低了系統(tǒng)建立新連接的開銷,同時(shí)也加速了用戶的訪問速度。統(tǒng)建立新連接的開銷,同時(shí)也加速了用戶的訪問速度。下面介紹連接池中連接的分配、釋放策略。下面介紹連接池中連接的分配、釋放策略。 連接池的分配、釋放策略對(duì)于有效復(fù)用連接池的分配、釋放策略對(duì)于有效復(fù)用連接非常重要,我們采用的方法是一個(gè)很連接非常重要,我們采用的方法是一個(gè)很有名的設(shè)計(jì)模式:有名的設(shè)計(jì)模式:Reference Counting(引用記數(shù))。該模式在復(fù)用資源方面應(yīng)(引用記數(shù))。該模式在復(fù)用資源方面應(yīng)用的非常廣泛,把該方法運(yùn)用到對(duì)于連接用的非常廣泛,把該方法運(yùn)用到對(duì)于連接的分配釋放上,為每一個(gè)數(shù)據(jù)庫(kù)連接

48、,保的分配釋放上,為每一個(gè)數(shù)據(jù)庫(kù)連接,保留一個(gè)引用記數(shù),用來(lái)記錄該連接的使用留一個(gè)引用記數(shù),用來(lái)記錄該連接的使用者的個(gè)數(shù)。具體的實(shí)現(xiàn)方法是:者的個(gè)數(shù)。具體的實(shí)現(xiàn)方法是: 當(dāng)客戶請(qǐng)求數(shù)據(jù)庫(kù)連接時(shí),首先查看連接當(dāng)客戶請(qǐng)求數(shù)據(jù)庫(kù)連接時(shí),首先查看連接池中是否有空閑連接(指當(dāng)前沒有分配出池中是否有空閑連接(指當(dāng)前沒有分配出去的連接)。如果存在空閑連接,則把連去的連接)。如果存在空閑連接,則把連接分配給客戶并作相應(yīng)處理(即標(biāo)記該連接分配給客戶并作相應(yīng)處理(即標(biāo)記該連接為正在使用,引用計(jì)數(shù)加接為正在使用,引用計(jì)數(shù)加1)。如果沒有)。如果沒有空閑連接,則查看當(dāng)前所開的連接數(shù)是不空閑連接,則查看當(dāng)前所開的連接數(shù)

49、是不是已經(jīng)達(dá)到是已經(jīng)達(dá)到maxConn(最大連接數(shù)),如(最大連接數(shù)),如果沒達(dá)到就重新創(chuàng)建一個(gè)連接給請(qǐng)求的客果沒達(dá)到就重新創(chuàng)建一個(gè)連接給請(qǐng)求的客戶;如果達(dá)到就按設(shè)定的戶;如果達(dá)到就按設(shè)定的maxWaitTime(最大等待時(shí)間)進(jìn)行等待,如果等待(最大等待時(shí)間)進(jìn)行等待,如果等待maxWaitTime后仍沒有空閑連接,就拋出后仍沒有空閑連接,就拋出無(wú)空閑連接的異常給用戶。無(wú)空閑連接的異常給用戶。 當(dāng)客戶釋放數(shù)據(jù)庫(kù)連接時(shí),先判斷該連接的引當(dāng)客戶釋放數(shù)據(jù)庫(kù)連接時(shí),先判斷該連接的引用次數(shù)是否超過了規(guī)定值,如果超過就刪除該用次數(shù)是否超過了規(guī)定值,如果超過就刪除該連接,并判斷當(dāng)前連接池內(nèi)總的連接數(shù)是否小

50、連接,并判斷當(dāng)前連接池內(nèi)總的連接數(shù)是否小于于minConn(最小連接數(shù)),若小于就將連接(最小連接數(shù)),若小于就將連接池充滿;如果沒超過就將該連接標(biāo)記為開放狀池充滿;如果沒超過就將該連接標(biāo)記為開放狀態(tài),可供再次復(fù)用。可以看出正是這套策略保態(tài),可供再次復(fù)用。可以看出正是這套策略保證了數(shù)據(jù)庫(kù)連接的有效復(fù)用,避免頻繁地建立、證了數(shù)據(jù)庫(kù)連接的有效復(fù)用,避免頻繁地建立、釋放連接所帶來(lái)的系統(tǒng)資源開銷。釋放連接所帶來(lái)的系統(tǒng)資源開銷。 連接池的配置連接池的配置 數(shù)據(jù)庫(kù)連接池中到底要放置多少個(gè)連接,才能使系統(tǒng)的性數(shù)據(jù)庫(kù)連接池中到底要放置多少個(gè)連接,才能使系統(tǒng)的性能更佳,用能更佳,用minConn和和maxCon

51、n來(lái)限制。來(lái)限制。minConn是當(dāng)應(yīng)是當(dāng)應(yīng)用啟動(dòng)的時(shí)候連接池所創(chuàng)建的連接數(shù),如果過大啟動(dòng)將變慢,用啟動(dòng)的時(shí)候連接池所創(chuàng)建的連接數(shù),如果過大啟動(dòng)將變慢,但是啟動(dòng)后響應(yīng)更快;如果過小啟動(dòng)加快,但是最初使用的但是啟動(dòng)后響應(yīng)更快;如果過小啟動(dòng)加快,但是最初使用的用戶將因?yàn)檫B接池中沒有足夠的連接不可避免的延緩了執(zhí)行用戶將因?yàn)檫B接池中沒有足夠的連接不可避免的延緩了執(zhí)行速度。因此應(yīng)該在開發(fā)的過程中設(shè)定較小速度。因此應(yīng)該在開發(fā)的過程中設(shè)定較小minConn,而在實(shí),而在實(shí)際應(yīng)用的中設(shè)定較大際應(yīng)用的中設(shè)定較大minConn。maxConn是連接池中的最是連接池中的最大連接數(shù),可以通過反復(fù)試驗(yàn)來(lái)確定此飽和點(diǎn)。為

52、此在連接大連接數(shù),可以通過反復(fù)試驗(yàn)來(lái)確定此飽和點(diǎn)。為此在連接池類池類ConnectionPool中加入兩個(gè)方法中加入兩個(gè)方法getActiveSize()和()和getOpenSize(),(),ActiveSize 表示某一時(shí)間有多少連接正表示某一時(shí)間有多少連接正被使用,被使用,OpenSize表示連接池中有多少連接被打開,反映了表示連接池中有多少連接被打開,反映了連接池使用的峰值。將這兩個(gè)值在日志信息中反應(yīng)出來(lái),連接池使用的峰值。將這兩個(gè)值在日志信息中反應(yīng)出來(lái), minConn的值應(yīng)該小于平均的值應(yīng)該小于平均ActiveSize,而,而maxConn的值的值應(yīng)該在應(yīng)該在activeSize

53、和和OpenSize之間。之間。 連接池的關(guān)鍵技術(shù)連接池的關(guān)鍵技術(shù) 事務(wù)處理事務(wù)處理 前面討論的是關(guān)于使用數(shù)據(jù)庫(kù)連接進(jìn)行普通的數(shù)據(jù)庫(kù)訪問。前面討論的是關(guān)于使用數(shù)據(jù)庫(kù)連接進(jìn)行普通的數(shù)據(jù)庫(kù)訪問。對(duì)于事務(wù)處理,情況就變得比較復(fù)雜。因?yàn)槭聞?wù)本身要求原則性的保對(duì)于事務(wù)處理,情況就變得比較復(fù)雜。因?yàn)槭聞?wù)本身要求原則性的保證,此時(shí)就要求對(duì)于數(shù)據(jù)庫(kù)的操作符合證,此時(shí)就要求對(duì)于數(shù)據(jù)庫(kù)的操作符合All-All-Nothing原則,即要原則,即要么全部完成,要么什么都不做。如果簡(jiǎn)單的采用上述的連接復(fù)用的策么全部完成,要么什么都不做。如果簡(jiǎn)單的采用上述的連接復(fù)用的策略,就會(huì)發(fā)生問題,因?yàn)闆]有辦法控制屬于同一個(gè)事務(wù)的多

54、個(gè)數(shù)據(jù)庫(kù)略,就會(huì)發(fā)生問題,因?yàn)闆]有辦法控制屬于同一個(gè)事務(wù)的多個(gè)數(shù)據(jù)庫(kù)操作方法的動(dòng)作,可能這些數(shù)據(jù)庫(kù)操作是在多個(gè)連接上進(jìn)行的,并且操作方法的動(dòng)作,可能這些數(shù)據(jù)庫(kù)操作是在多個(gè)連接上進(jìn)行的,并且這些連接可能被其他非事務(wù)方法復(fù)用。這些連接可能被其他非事務(wù)方法復(fù)用。Connection本身具有提供了本身具有提供了對(duì)于事務(wù)的支持,可以通過設(shè)置對(duì)于事務(wù)的支持,可以通過設(shè)置Connection的的AutoCommit屬性為屬性為false,顯式的調(diào)用,顯式的調(diào)用 commit或或rollback方法來(lái)實(shí)現(xiàn)。但是要安全、高方法來(lái)實(shí)現(xiàn)。但是要安全、高效的進(jìn)行連接復(fù)用,就必須提供相應(yīng)的事務(wù)支持機(jī)制。方法是:采用效的

55、進(jìn)行連接復(fù)用,就必須提供相應(yīng)的事務(wù)支持機(jī)制。方法是:采用顯式的事務(wù)支撐方法,每一個(gè)事務(wù)獨(dú)占一個(gè)連接。這種方法可以大大顯式的事務(wù)支撐方法,每一個(gè)事務(wù)獨(dú)占一個(gè)連接。這種方法可以大大降低對(duì)于事務(wù)處理的復(fù)雜性,并且又不會(huì)妨礙連接的復(fù)用。降低對(duì)于事務(wù)處理的復(fù)雜性,并且又不會(huì)妨礙連接的復(fù)用。 連接管理服務(wù)提供了顯式的事務(wù)開始、結(jié)束連接管理服務(wù)提供了顯式的事務(wù)開始、結(jié)束(commit或或rollback)聲明,以及一個(gè)事務(wù)注冊(cè)表,)聲明,以及一個(gè)事務(wù)注冊(cè)表,用于登記事務(wù)發(fā)起者和事務(wù)使用的連接的對(duì)應(yīng)關(guān)系,用于登記事務(wù)發(fā)起者和事務(wù)使用的連接的對(duì)應(yīng)關(guān)系,通過該表,使用事務(wù)的部分和連接管理部分就隔離開,通過該表,使

56、用事務(wù)的部分和連接管理部分就隔離開,因?yàn)樵摫硎窃谶\(yùn)行時(shí)根據(jù)實(shí)際的調(diào)用情況動(dòng)態(tài)生成的。因?yàn)樵摫硎窃谶\(yùn)行時(shí)根據(jù)實(shí)際的調(diào)用情況動(dòng)態(tài)生成的。事務(wù)使用的連接在該事務(wù)運(yùn)行中不能被復(fù)用。在實(shí)現(xiàn)事務(wù)使用的連接在該事務(wù)運(yùn)行中不能被復(fù)用。在實(shí)現(xiàn)中,用戶標(biāo)識(shí)是通過使用者所在的線程來(lái)標(biāo)識(shí)的。后中,用戶標(biāo)識(shí)是通過使用者所在的線程來(lái)標(biāo)識(shí)的。后面的所有對(duì)于數(shù)據(jù)庫(kù)的訪問都是通過查找該注冊(cè)表,面的所有對(duì)于數(shù)據(jù)庫(kù)的訪問都是通過查找該注冊(cè)表,使用已經(jīng)分配的連接來(lái)完成的。當(dāng)事務(wù)結(jié)束時(shí),從注使用已經(jīng)分配的連接來(lái)完成的。當(dāng)事務(wù)結(jié)束時(shí),從注冊(cè)表中刪除相應(yīng)表項(xiàng)。冊(cè)表中刪除相應(yīng)表項(xiàng)。 并發(fā)并發(fā) 為了使連接管理服務(wù)有更大的通用性,我們必為了使連

57、接管理服務(wù)有更大的通用性,我們必須要考慮到多線程環(huán)境,即并發(fā)問題。在一個(gè)多線須要考慮到多線程環(huán)境,即并發(fā)問題。在一個(gè)多線程的環(huán)境下,必須要保證連接管理自身數(shù)據(jù)的一致程的環(huán)境下,必須要保證連接管理自身數(shù)據(jù)的一致性和連接內(nèi)部數(shù)據(jù)的一致性,在這方面性和連接內(nèi)部數(shù)據(jù)的一致性,在這方面Java提供很提供很好的支持(好的支持(synchronized關(guān)鍵字),這樣就很容關(guān)鍵字),這樣就很容易使連接管理成為線程安全的。易使連接管理成為線程安全的。 多數(shù)據(jù)庫(kù)服務(wù)器多數(shù)據(jù)庫(kù)服務(wù)器 在實(shí)際應(yīng)用中,應(yīng)用程序常常需要訪問多個(gè)在實(shí)際應(yīng)用中,應(yīng)用程序常常需要訪問多個(gè)不同的數(shù)據(jù)庫(kù)。如何通過同一個(gè)連接池訪問不同的數(shù)不同的數(shù)據(jù)

58、庫(kù)。如何通過同一個(gè)連接池訪問不同的數(shù)據(jù)庫(kù),是應(yīng)用程序需要解決的一個(gè)核心問題據(jù)庫(kù),是應(yīng)用程序需要解決的一個(gè)核心問題 連接池應(yīng)用的實(shí)現(xiàn)連接池應(yīng)用的實(shí)現(xiàn)一個(gè)完整的連接池應(yīng)用包括三個(gè)部分:一個(gè)完整的連接池應(yīng)用包括三個(gè)部分:DBConnectionPool類,負(fù)責(zé)從連接池獲取類,負(fù)責(zé)從連接池獲取(或創(chuàng)建或創(chuàng)建)連接、將連接返回給連接池、系統(tǒng)關(guān)閉時(shí)關(guān)閉所有連連接、將連接返回給連接池、系統(tǒng)關(guān)閉時(shí)關(guān)閉所有連接釋放所有資源;接釋放所有資源;DBConnectionManager類,負(fù)責(zé)類,負(fù)責(zé)裝載和注冊(cè)裝載和注冊(cè)JDBC驅(qū)動(dòng)、根據(jù)屬性文件中定義的屬性驅(qū)動(dòng)、根據(jù)屬性文件中定義的屬性創(chuàng)建創(chuàng)建DBConnection

59、Pool、跟蹤應(yīng)用程序?qū)B接池的、跟蹤應(yīng)用程序?qū)B接池的引用等;應(yīng)用程序?qū)B接池的使用。引用等;應(yīng)用程序?qū)B接池的使用。 本文實(shí)現(xiàn)的數(shù)據(jù)庫(kù)連接池包括一個(gè)管理類本文實(shí)現(xiàn)的數(shù)據(jù)庫(kù)連接池包括一個(gè)管理類DBConnectionManager,負(fù)責(zé)提供與多個(gè)連接池,負(fù)責(zé)提供與多個(gè)連接池對(duì)象對(duì)象(DBConnectionPool類類)之間的接口。每一個(gè)連之間的接口。每一個(gè)連接池對(duì)象管理一組封裝過的接池對(duì)象管理一組封裝過的JDBC連接對(duì)象連接對(duì)象Conn,封裝過的封裝過的JDBC連接對(duì)象連接對(duì)象Conn可以被任意數(shù)量的可以被任意數(shù)量的Model層的組件共享。層的組件共享。 類類Conn 的設(shè)計(jì)很簡(jiǎn)單,如下所

60、示:的設(shè)計(jì)很簡(jiǎn)單,如下所示: Class Conn Private java. sgl .Connection con; /數(shù)據(jù)庫(kù)連數(shù)據(jù)庫(kù)連接對(duì)象接對(duì)象 Public Boolean inUse ; /是否被使用是否被使用 Public long lastAccess; /最近一次釋放該連最近一次釋放該連接的時(shí)間接的時(shí)間 Public int useCount; / 被使用次數(shù)被使用次數(shù) 下面是實(shí)現(xiàn)連接池的主要代碼:下面是實(shí)現(xiàn)連接池的主要代碼: / 初始化數(shù)據(jù)庫(kù)連接池初始化數(shù)據(jù)庫(kù)連接池 public static synchronized void FastInitPool() throws

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論