WEB應用及開發(fā)-10JDBC及數(shù)據庫(JDBC及SQL語句、存儲過程應用)_第1頁
WEB應用及開發(fā)-10JDBC及數(shù)據庫(JDBC及SQL語句、存儲過程應用)_第2頁
WEB應用及開發(fā)-10JDBC及數(shù)據庫(JDBC及SQL語句、存儲過程應用)_第3頁
WEB應用及開發(fā)-10JDBC及數(shù)據庫(JDBC及SQL語句、存儲過程應用)_第4頁
WEB應用及開發(fā)-10JDBC及數(shù)據庫(JDBC及SQL語句、存儲過程應用)_第5頁
已閱讀5頁,還剩62頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第十講課題JDBC與數(shù)據庫(JDBC與SQL語句、存儲過程的應用)目的要求掌握JDBC存取各種不同數(shù)據庫的方法教學重點掌握JDBC與不同數(shù)據庫的連接字符串、連接池教學難點JSP如何存取存儲過程中輸入參數(shù)、輸出參數(shù)、輸入輸出參數(shù)教學課時4(含2課時上機)教學方法講解、示例與啟發(fā)式教學相結合教學內容和步驟10.1JDBC與數(shù)據庫編程10.1.1JDBC的Driver可分為以下四種類型

(1)JDBC-ODBCBridge和ODBCDriver這種驅動器器通過ODBC驅動器提供數(shù)據庫連接。使用這種驅動器,要求每一臺客戶機都裝入ODBC的驅動器。

(2)Native-APIpartly-JavaDriver這種驅動器將JDBC指令轉化成所連接使用的DBMS的操作形式。各客戶機使用的數(shù)據庫可能是Oracle,可能是Sybase,也可能是Access,都需要在客戶機上裝有相應DBMS的驅動程序。

(3)JDBC-NetAll-JavaDriver這種驅動器將JDBC指令轉化成獨立于DBMS的網絡協(xié)議形式,再由服務器轉化為特定DBMS的協(xié)議形式。有關DBMS的協(xié)議由各數(shù)據庫廠商決定。這種驅動器可以聯(lián)接到不同的數(shù)據庫上,最為靈活。目前一些廠商已經開始添加JDBC的這種驅動器到他們已有的數(shù)據庫中介產品中。要注意的是,為了支持廣域網存取,需要增加有關安全性的措施,如防火墻等等。

(4)Native-protocolAll-JavaDriver這種驅動器將JDBC指令轉化成網絡協(xié)議后不再轉換,由DBMS直接使用。相當于客戶機直接與服務器聯(lián)系,對局域網適用。在這四種驅動器中,后兩類“純Java”(All-Java)的驅動器效率更高,也更具有通用性。但目前第一、第二類驅動器比較容易獲得,使用也較普遍。10.1.2關于JDBCUrl語法如下:

jdbc:<子協(xié)議>:<子名稱><子協(xié)議>驅動程序名稱或數(shù)據庫連接機制,子協(xié)議名稱的典型例子就是ODBC,如:jdbc:odbc:fff<子名稱>一種標識數(shù)據庫的方法。子名稱可以依據不同的子協(xié)議而發(fā)生變化如:jdbc:dbnet//womat:356//fffODBC子協(xié)議:Jdbc:odbc:<數(shù)據源名稱>[;<屬性名>=<屬性值>]如:

jdbc:odbc:sqlconn:UID=sa;PWD=ww10.2JDBC編程10.2.1程序基本結構一般的JDBC程序都完成三項功能:與數(shù)據庫建立連接;傳送SQL聲明以及對返回結果進行處理。下面我們通過一個具體例子說明這三項功能的實現(xiàn)過程。例1:Creage.java給出了一個簡單的JDBC程序,此程序執(zhí)行后創(chuàng)建一張名為testTable的表,表中包括兩個域,域名分別為id和name。import.URL;importjava.sql.*;classCreate{publicstaticvoidmain(String[]args){Stringurl="jdbc:odbc:demo";Stringquery="CREATETABLEtestTable"+"(idINT,nameCHAR(10))";try{//下載jdbc-odbcbridge驅動器

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//關于此句參見下面Cyclone的注釋//與驅動器建立連接,這里可使用不同的特定驅動,如jdbcfororacle或jdbcforsqlserverConnectioncon=DriverManager.getConnection(url,"user","password");//創(chuàng)建一個Statement對象Statementstmt=con.createStatement();//執(zhí)行SQL聲明stmt.executeUpdate(query);System.out.println("Createsuccessfully!");//關閉stmstmt.close();//關閉連接con.close();}catch(SQLExceptionex){//SQL異常信息System.out.println("\n***SQLExceptioncaught***\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.Exceptionex){ex.printStackTrace();}}}2.2Statement類及其子類1)Statement接口Statementstmt=con.createStatement();//執(zhí)行SQL聲明intcount1=stmt.executeUpdate("INSERTINTOtestTable(id,name)VALUES(1,'wu')");intcount2=stmt.executeUpdate("INSERTINTOtestTable(id,name)VALUES(2,'wang')");2)PreparedStatement接口Stringdata[][]={{"5","xu"},{"6","yan"}};PreparedStatement

pstmt=con.prepareStatement("INSERTINTOtestTable(id,name)VALUES(?,?)");//參數(shù)賦值,執(zhí)行SQL聲明for(inti=0;i<data.length;i++){pstmt.setInt(1,Integer.parseInt(data[i][0]));pstmt.setString(2,data[i][1]);

pstmt.executeUpdate();}3)CallableStatement接口

CallableStatement

cstmt=con.prepareCall("{callSearch(?)}");//參數(shù)賦值cstmt.setInt(1,934678);//執(zhí)行儲存過程。cstmt.execute();2.3結果集ResultSet及ResultSetMetaDataStringquery="SELECT*FROMtestTable";Statementstmt=con.createStatement();//發(fā)出查詢要求,獲得結果集ResultSet

rs=stmt.executeQuery(query);//顯示結果集各行各列System.out.println("ThedetailoftestTableis:");ResultSetMetaData

rsmd=rs.getMetaData();//獲得結果集列數(shù)innumCols=rsmd.getColumnCount();//顯示列標題for(inti=1;i<=numCols;i++){if(i>1)System.out.print(",");System.out.print(rsmd.getColumnLabel(i));}System.out.println("");//顯示結果集信息while(rs.next()){//顯示一行for(inti=1;i<=numCols;i++)

{if(i>1)System.out.print(",");System.out.print(rs.getString(i));}2.4DatabaseMetaDataDatabaseMetaData

dma=con.getMetaData();//驅動器和URL信息System.out.println("\nConnectedto"+dma.getURL());System.out.println("Driver"+dma.getDriverName());System.out.println("Version"+dma.getDriverVersion()//數(shù)據庫信息System.out.println("\nDataBasename:"+dma.getDatabaseProductName()+dma.getDatabaseProductVersion());System.out.println("DataBasesupportsSQLkeywords:\n\t"+dma.getSQLKeywords());//數(shù)據庫功能信息函數(shù)dma.supportsANSI92EntryLevelSQL()dma.supportsANSI92FullSQL()dma.supportsStoredProcedures()10.2.2JDBC數(shù)據類型及類型轉換⑴JDBC的數(shù)據類型

JDBC的sql包中除了與數(shù)據庫連接有關的抽象接口及與驅動器有關的DriverManager、DriverPropertyInfo等類型外,還定義了若干數(shù)據類,用以代表數(shù)據庫中可能用到的SQL類型。下面我們就對它們逐一進行簡略介紹。①sql.Date

sql包中的日期類Date是util包中Date類的子類,實際上也是util.Date類的子集。它只處理年月日,而忽略小時和分秒,用以代表SQL的DATE信息。

Date類的構造方法為:

publicDate(intyear,intmouth,intday)其中參數(shù)格式同util.Date類的構造方法一樣,年參數(shù)為所需設定的年份減去1900所得的整數(shù)值,月參數(shù)為0至11,日參數(shù)為1至31。如1998年1月23日所對應創(chuàng)建日期類的方法調用為:

Dated=newDate(98,0,23);

Date類還提供兩個與String類互相轉換的方法,分別是:

publicstaticDatevalueOf(Strings)將字符串類參數(shù)轉換為日期類對象。其中String類參數(shù)S的格式為“年-月-日”,加“1997-04-12”。

publicStringtoString()將日期類對象轉換為String類對象表示,同樣采用“年-月-日”的格式。②sql.Time該類是util.Date類的子類,也是它的一個子集。在Time類里,只處理小時和分秒,代表SQL的TIME類型。它與sql.Date合起來才表示完整的util.Date類信息。

Time類的構造方法為:

publicTime(int

hour,int

minute,intsecond)其中小時參數(shù)值為0至23,分秒參數(shù)取值均為0至59。與sql.Date一樣,Time類也定義了兩個與String類互相轉換的函數(shù)ValueOf和String。不同的是String類對象的格式為“小時:分:秒”,如“12:26:06”。③sql.Timestamp這個類也是util.Date類的子類,其中除了包含年月日、小時和分秒和信息之外,還加入了納秒信息(nanosecond),1納秒即1毫微秒。Timestamp類用來代表SQL時間戳(Timestamp)類型信息。

Timestamp類的構造方法為:

publicTimestamp(intyear,intmouth,intdate,inthour,intminute,intsecond,int

nano)其中納秒參數(shù)的取值從0至999,999,999,其余各參數(shù)同前。

Timestamp類特別定義了設置和獲得納秒信息的方法,分別是

publicgetnanos()獲取時間戳的納秒部分

publicvoidsetNanos(intn)以給定數(shù)值設置時間戳的納秒部分④sql.Types

Types類是Object類的直接子類。在這個類中以靜態(tài)常量的形式定義了可使用的SQL的數(shù)值類型。所有這些類型常量都以前綴

publicfinalstaticint的形式標明是公有靜態(tài)整數(shù),且不可改動。具體的類型名和含義如表11.1所示。其中OTHER用來代表數(shù)據庫定義的特殊數(shù)據,可以用getObject或setObject方法將其映射為一個Java的Object對象。表1Types中定義的SQL類型類型名含義BIGINT長整型數(shù)BINARY二進制數(shù)BIT比特數(shù)CHAR字符型DATE日期型DECIMAL十進制數(shù)DOUBLE雙精度數(shù)FLOAT浮點數(shù)INTEGER整數(shù)LONGVARBINARY可變長型二進制數(shù)LONGVARCHAR可變長型字符NULL空類型NUMERIC數(shù)值型OTHER其他類型REAL實數(shù)SMALLINT短整型TIME時間類型TIMESTAMP時間戳類型TINYINT微整型VARBINARY可變二進制數(shù)VARCHAR可變字符型⑵SQL與Java由于SQL數(shù)據類型與Java的數(shù)據類型不一致,因而在使用Java類型的應用程序與使用SQL類型的數(shù)據庫之間,需要某種讀寫類型轉換機制。實際上我們前面介紹的ResultSet類的“get”系列方法,Statement及其子類的“set“系列方法和registerOutParameter方法,都是這一轉換機制的組成部分。需要進行的讀寫轉換包括下面情況:從數(shù)據庫中讀取數(shù)值后,存放在ResultSet對象中的是SQL類型的數(shù)據。而調用“get”系列方法時,JDBC才將SQL類型轉換為指定的Java類型。在一般情形下,SQL類型相對應的Java類型如表11-2所示。⑵SQL與Java由于SQL數(shù)據類型與Java的數(shù)據類型不一致,因而在使用Java類型的應用程序與使用SQL類型的數(shù)據庫之間,需要某種讀寫類型轉換機制。實際上我們前面介紹的ResultSet類的“get”系列方法,Statement及其子類的“set“系列方法和registerOutParameter方法,都是這一轉換機制的組成部分。需要進行的讀寫轉換包括下面情況:從數(shù)據庫中讀取數(shù)值后,存放在ResultSet對象中的是SQL類型的數(shù)據。而調用“get”系列方法時,JDBC才將SQL類型轉換為指定的Java類型。在一般情形下,SQL類型相對應的Java類型如表11-2所示。表2SQL類型一般所對應的Java類型SQLtypeJavatypeCHARjava.lang.StringVARCHARjava.lang.StringLONGVARCHARjava.lang.StringNUMERICjava.lang.BignumDECIMALjava.lang.Bignum⑶字符類型JDBC字符串數(shù)據類型為CHAR、VARCHAR和LONGVARCHAR。類型說明Fixed-lengthSQLServerchar

和nchar

數(shù)據類型直接映射到JDBCCHAR

類型。這些都是在列具有SETANSI_PADDINGON的情況下,具有由服務器提供的填充的固定長度的類型。對于nchar,填充始終是打開的,但對于char,在未填充服務器字符列的情況下,JDBC驅動程序將添加填充。Variable-lengthSQLServervarchar

和nvarchar

類型直接映射到JDBCVARCHAR類型。LongSQLServertext和ntext

類型映射到JDBCLONGVARCHAR類型。對于SQLServer2005來說,這些類型已過時,因此應改用大值類型。針對text和ntext

服務器列使用update<NumericType>和updateObject(int,java.lang.Object)

方法時將失敗。然而,對于text和ntext

服務器列,支持將setObject

方法用于指定的字符轉換類型。⑷二進制字符串類型JDBC二進制字符串類型為BINARY、VARBINARY和LONGVARBINARY。類型說明固定長度SQLServerbinary類型直接映射到JDBCBINARY類型。這是在列具有SETANSI_PADDINGON的情況下,具有由服務器提供填充的固定長度類型。沒有填充服務器char列時,JDBC驅動程序會添加填充。SQLServertimestamp類型是具有8個字節(jié)的固定長度的JDBCBINARY類型??勺冮L度SQLServervarbinary

類型映射到JDBCVARBINARY類型。LongSQLServerimage類型映射到JDBCLONGVARBINARY類型。對于SQLServer2005來說,該類型已過時,因此應改用大值類型。SQLServer2005中的udt

類型作為LONGBINARY類型映射到JDBC。⑸精確數(shù)字類型JDBC精確數(shù)字類型直接映射到其對應的SQLServer

類型。類型說明BITJDBCBIT類型表示可能是0或1的單個位。此類型映射到SQLServerbit類型。TINYINTJDBCTINYINT類型表示單個字節(jié)。此類型映射到SQLServertinyint

類型。SMALLINTJDBCSMALLINT類型表示有符號的16位整數(shù)。此類型映射到SQLServersmallint

類型。INTEGERJDBCINTEGER類型表示有符號的32位整數(shù)。此類型映射到SQLServerint

類型。BIGINTJDBCBIGINT類型表示有符號的64位整數(shù)。此類型映射到SQLServerbigint

類型。NUMERICJDBCNUMERIC類型表示固定精度的十進制值,它可存放相同精度的值。NUMERIC類型映射到SQLServernumeric類型。DECIMALJDBCDECIMAL類型表示固定精度的十進制值,它可存放至少具有指定精度的值。DECIMAL類型映射到SQLServerdecimal類型。JDBCDECIMAL類型還映射到SQLServermoney和smallmoney

類型,這些類型是特定的固定精度的十進制類型,分別以8個字節(jié)和4個字節(jié)進行存儲。⑹近似數(shù)字類型JDBC近似數(shù)值數(shù)據類型為REAL、DOUBLE

和FLOAT。類型說明

REALJDBCREAL

類型具有7位精度(單精度)并直接映射到SQLServerreal

類型。DOUBLEJDBCDOUBLE類型具有15位精度(雙精度)并直接映射到SQLServerfloat類型。JDBCFLOAT類型是DOUBLE的同義詞。由于FLOAT與DOUBLE之間可能存在沖突,因此DOUBLE為首選類型。⑺日期時間類型JDBCTIMESTAMP類型映射到SQLServerdatetime

和smalldatetime

類型。datetime

類型以兩個4字節(jié)整數(shù)進行存儲。smalldatetime

類型可存放相同的信息(日期和時間),但精度較低,為兩個2字節(jié)的小整數(shù)。10.3JDBC與數(shù)據庫的連接字符串⑴MySQL()mm.mysql-2.0.2-bin.jarClass.forName("org.gjt.mm.mysql.Driver");cn=DriverManager.getConnection("jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName",sUsr,sPwd);⑵Oracle(/ip/deploy/database/oracle9i/)classes12.zipClass.forName("oracle.jdbc.driver.OracleDriver");cn=DriverManager.getConnection("jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL",sUsr,sPwd);⑶Sybase()jconn2.jarClass.forName("com.sybase..jdbc.SybDriver");cn=DriverManager.getConnection("jdbc:sybase:Tds:MyDbComputerNameOrIP:2638",sUsr,sPwd);//(Default-Username/Password:"dba"/"sql")⑷MicrosoftSQLServer(http://)Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");cn=DriverManager.getConnection("jdbc:microsoft:sqlserver://MyDbComputerNameOrIP:1433;databaseName=master",sUsr,sPwd);⑸ODBCClass.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connectioncn=DriverManager.getConnection("jdbc:odbc:"+sDsn,sUsr,sPwd);⑹informix

Class.forName("rmix.jdbc.IfxDriver").newInstance();Stringurl="jdbc:informix-sqli://9:1533/testDB:INFORMIXSERVER=myserver;user=testuser;password=testpassword";⑺sybaseClass.forName("com.sybase.jdbc.SybDriver")url="jdbc:sybase:Tds::2638/asademo";SybConnectionconnection=(SybConnection)DriverManager.getConnection(url,"dba","sql");

例2:queryBook.jsp<%@pagecontentType="text/html;charset=gb2312"%><%@pagelanguage="java"import="java.sql.*,java.io.*"%><HTML><BODY><CENTER><FONTSIZE=5COLOR=blue>圖書信息瀏覽</FONT><tableborder=3><tr><td><b><center>ID號</td><td><b><center>書名</td><td><b><center>出版社</td><td><b><center>價格</td></tr><%Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();Connectioncon=java.sql.DriverManager.getConnection("jdbc:microsoft:sqlserver://:1433;DatabaseName=jspdb","sa","");Statementstmt=con.createStatement();ResultSet

rst=stmt.executeQuery("select*frombook;");while(rst.next()){out.println("<tr>");out.println("<td>"+rst.getString("bkld")+"</td>");out.println("<td>"+rst.getString("bkName")+"</td>");out.println("<td>"+rst.getString("bkPublisher")+"</td>");out.println("<td>"+rst.getFloat("bkPrice")+"元"+"</td>");out.println("</tr>");}rst.close();stmt.close();con.close();%></table></BODY></HTML>10.4連接池⑴連接池原理

連接池技術的核心思想是:連接復用,通過建立一個數(shù)據庫連接池以及一套連接使用、分配、管理策略,使得該連接池中的連接可以得到高效、安全的復用,避免了數(shù)據庫連接頻繁建立、關閉的開銷。另外,由于對JDBC中的原始連接進行了封裝,從而方便了數(shù)據庫應用對于連接的使用(特別是對于事務處理),提高了開發(fā)效率,也正是因為這個封裝層的存在,隔離了應用的本身的處理邏輯和具體數(shù)據庫訪問邏輯,使應用本身的復用成為可能。連接池主要由三部分組成:連接池的建立、連接池中連接的使用管理、連接池的關閉。⑵連接池的管理連接池管理策略是連接池機制的核心。當連接池建立后,如何對連接池中的連接進行管理,解決好連接池內連接的分配和釋放,對系統(tǒng)的性能有很大的影響。連接的合理分配、釋放可提高連接的復用,降低了系統(tǒng)建立新連接的開銷,同時也加速了用戶的訪問速度。下面介紹連接池中連接的分配、釋放策略。

連接池的分配、釋放策略對于有效復用連接非常重要,我們采用的方法是一個很有名的設計模式:ReferenceCounting(引用記數(shù))。該模式在復用資源方面應用的非常廣泛,把該方法運用到對于連接的分配釋放上,為每一個數(shù)據庫連接,保留一個引用記數(shù),用來記錄該連接的使用者的個數(shù)。具體的實現(xiàn)方法是:當客戶請求數(shù)據庫連接時,首先查看連接池中是否有空閑連接(指當前沒有分配出去的連接)。如果存在空閑連接,則把連接分配給客戶并作相應處理(即標記該連接為正在使用,引用計數(shù)加1)。如果沒有空閑連接,則查看當前所開的連接數(shù)是不是已經達到maxConn(最大連接數(shù)),如果沒達到就重新創(chuàng)建一個連接給請求的客戶;如果達到就按設定的maxWaitTime(最大等待時間)進行等待,如果等待maxWaitTime后仍沒有空閑連接,就拋出無空閑連接的異常給用戶。當客戶釋放數(shù)據庫連接時,先判斷該連接的引用次數(shù)是否超過了規(guī)定值,如果超過就刪除該連接,并判斷當前連接池內總的連接數(shù)是否小于minConn(最小連接數(shù)),若小于就將連接池充滿;如果沒超過就將該連接標記為開放狀態(tài),可供再次復用??梢钥闯稣沁@套策略保證了數(shù)據庫連接的有效復用,避免頻繁地建立、釋放連接所帶來的系統(tǒng)資源開銷。⑶連接池的配置數(shù)據庫連接池中到底要放置多少個連接,才能使系統(tǒng)的性能更佳,用minConn和maxConn來限制。minConn是當應用啟動的時候連接池所創(chuàng)建的連接數(shù),如果過大啟動將變慢,但是啟動后響應更快;如果過小啟動加快,但是最初使用的用戶將因為連接池中沒有足夠的連接不可避免的延緩了執(zhí)行速度。因此應該在開發(fā)的過程中設定較小minConn,而在實際應用的中設定較大minConn。maxConn是連接池中的最大連接數(shù),可以通過反復試驗來確定此飽和點。為此在連接池類ConnectionPool中加入兩個方法getActiveSize()和getOpenSize(),ActiveSize

表示某一時間有多少連接正被使用,OpenSize表示連接池中有多少連接被打開,反映了連接池使用的峰值。將這兩個值在日志信息中反應出來,minConn的值應該小于平均ActiveSize,而maxConn的值應該在activeSize和OpenSize之間。⑷連接池的關鍵技術①事務處理

前面討論的是關于使用數(shù)據庫連接進行普通的數(shù)據庫訪問。對于事務處理,情況就變得比較復雜。因為事務本身要求原則性的保證,此時就要求對于數(shù)據庫的操作符合"All-All-Nothing"原則,即要么全部完成,要么什么都不做。如果簡單的采用上述的連接復用的策略,就會發(fā)生問題,因為沒有辦法控制屬于同一個事務的多個數(shù)據庫操作方法的動作,可能這些數(shù)據庫操作是在多個連接上進行的,并且這些連接可能被其他非事務方法復用。Connection本身具有提供了對于事務的支持,可以通過設置Connection的AutoCommit屬性為false,顯式的調用commit或rollback方法來實現(xiàn)。但是要安全、高效的進行連接復用,就必須提供相應的事務支持機制。方法是:采用顯式的事務支撐方法,每一個事務獨占一個連接。這種方法可以大大降低對于事務處理的復雜性,并且又不會妨礙連接的復用。連接管理服務提供了顯式的事務開始、結束(commit或rollback)聲明,以及一個事務注冊表,用于登記事務發(fā)起者和事務使用的連接的對應關系,通過該表,使用事務的部分和連接管理部分就隔離開,因為該表是在運行時根據實際的調用情況動態(tài)生成的。事務使用的連接在該事務運行中不能被復用。在實現(xiàn)中,用戶標識是通過使用者所在的線程來標識的。后面的所有對于數(shù)據庫的訪問都是通過查找該注冊表,使用已經分配的連接來完成的。當事務結束時,從注冊表中刪除相應表項。②并發(fā)為了使連接管理服務有更大的通用性,我們必須要考慮到多線程環(huán)境,即并發(fā)問題。在一個多線程的環(huán)境下,必須要保證連接管理自身數(shù)據的一致性和連接內部數(shù)據的一致性,在這方面Java提供很好的支持(synchronized關鍵字),這樣就很容易使連接管理成為線程安全的。③多數(shù)據庫服務器在實際應用中,應用程序常常需要訪問多個不同的數(shù)據庫。如何通過同一個連接池訪問不同的數(shù)據庫,是應用程序需要解決的一個核心問題⑸連接池應用的實現(xiàn)一個完整的連接池應用包括三個部分:DBConnectionPool類,負責從連接池獲取(或創(chuàng)建)連接、將連接返回給連接池、系統(tǒng)關閉時關閉所有連接釋放所有資源;DBConnectionManager類,負責裝載和注冊JDBC驅動、根據屬性文件中定義的屬性創(chuàng)建DBConnectionPool、跟蹤應用程序對連接池的引用等;應用程序對連接池的使用。本文實現(xiàn)的數(shù)據庫連接池包括一個管理類DBConnectionManager,負責提供與多個連接池對象(DBConnectionPool類)之間的接口。每一個連接池對象管理一組封裝過的JDBC連接對象Conn,封裝過的JDBC連接對象Conn可以被任意數(shù)量的Model層的組件共享。類Conn

的設計很簡單,如下所示:

ClassConn{

Privatejava.sgl.Connectioncon;//數(shù)據庫連接對象

PublicBooleaninUse;//是否被使用

PubliclonglastAccess;//最近一次釋放該連接的時間

Publicint

useCount;//被使用次數(shù)

}下面是實現(xiàn)連接池的主要代碼:

//初始化數(shù)據庫連接池

publicstaticsynchronizedvoidFastInitPool()

throwsException{

try{Class.forName(driver);

for(inti=0;i<size;i++){

Connectioncon=createConnection();

if(con!=null)addConnection(con);

}}}

//向連接池對象中添加數(shù)據庫連接

privatestaticvoidaddConnection(Connectioncon){

if(pool=null||pool1=null){

pool=newVector(size);

pool1=newVector(size);}

pool.addElement(con);

pool1.addElement("false");}

//獲取數(shù)據庫連接

publicstaticsynchronizedConnectiongetConn()

throwsException{

Connectionconn=null;

try{if(driver=null)

FastInitPool();

//獲得一個可用的(空閑的)連接

.for(inti=0;i<pool.size();i++){

conn=(Connection)pool.elementAt(i);

if(pool1.elementAt(i)=="false"){

pool1.set(i,"true");

//System.out.println("從連接池中獲取第"+(i+1)+"個空閑連接");

returnconn;

}

}

//如果沒有可用連接,且已有連接數(shù)小于最大連接數(shù)限制,則創(chuàng)建并增加一個新連接到連接池

conn=createConnection();

pool.addElement(conn);

pool1.addElement("true");

//System.out.println("所有連接都在使用,在連接池中再創(chuàng)建一個新連接");

}

catch(Exceptione){

System.err.println(e.g

溫馨提示

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

評論

0/150

提交評論