[計算機]關于如何使用JSP訪問Oracle數據庫的方法_第1頁
[計算機]關于如何使用JSP訪問Oracle數據庫的方法_第2頁
[計算機]關于如何使用JSP訪問Oracle數據庫的方法_第3頁
[計算機]關于如何使用JSP訪問Oracle數據庫的方法_第4頁
[計算機]關于如何使用JSP訪問Oracle數據庫的方法_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、.如何使用JSP訪問Oracle數據庫本章內容l 數據引擎JDBCl 通過JDBC-ODBC訪問Oracle數據庫l 使用JDBC訪問數據庫l 使用JavaBean模式訪問數據庫l 使用連接池訪問數據庫l 其他典型JSP數據庫訪問本章目標l 熟悉JDBC數據引擎技術,掌握其在Windows下的配置和使用方法l 掌握JavaBean+JSP訪問Oracle數據庫的方法8.1 數據引擎JDBC數據庫連接對動態(tài)網站來說是最為重要的部分,Java中連接數據庫的技術是JDBC(Java Database Connectivity)。JDBC是一種可用于執(zhí)行SQL語句的Java API,它為數據庫應用開發(fā)

2、人員、數據庫前臺工具開發(fā)人員提供了一種標準的應用程序設計接口,使開發(fā)人員可以用純Java語言編寫完整的數據庫應用程序。在了解JDBC之前,有必要了解一下Microsoft公司制訂的統一數據庫編程接口的解決方案,即ODBC(Open DataBase Connectivity,開放式數據庫互連)。Microsoft推出的ODBC技術為不同數據庫的訪問提供了統一的接口。ODBC在不同的數據庫各自的驅動之上建立了一組對數據庫訪問的標準API,這些API利用SQL語句來完成其大部分任務。數據庫的ODBC驅動程序負責所有的底層數據庫訪問操作,然后給上層的應用程序提供統一的編程接口,上層的應用程序只需調用

3、ODBC的統一編程接口就能與數據庫打交道。因此,基于ODBC的應用程序對數據庫的操作不依賴于具體的數據庫,不論是Access,SQL Server、DB2還是Oracle數據庫,均可以用ODBC API進行訪問,程序代碼都完全相同,也就是說,ODBC能以統一的方式處理所有的數據庫。ODBC可以為不同的數據庫提供相應的驅動程序。對于Microsoft公司自己的數據庫產品,比如SQL Server和Access,在Windows操作系統里內置了支持這些數據庫的ODBC驅動程序,而對于其他公司的數據庫產品,則需要安裝相應的ODBC驅動程序。ODBC數據源是作為數據源使用的數據庫或數據庫服務器。在數據

4、庫應用程序中,通過ODBC數據源來連接數據庫。在連接數據庫之前,要在Windows的控制面板中使用ODBC管理程序來注冊這個數據源。ODBC驅動程序是一個動態(tài)鏈接庫,它將數據源與應用程序相連接。ODBC在數據庫技術發(fā)展的過程中占有極其重要的地位,它如此成功,以至于成為當時數據庫技術中的一個標準。但是ODBC對數據庫的兼容性是以效率的降低為代價的,ODBC可以看作是在數據層和應用程序之間的一個中間層,因此利用ODBC訪問數據庫的效率要低于直接通過數據庫專用驅動的訪問。ODBC最大的問題不是效率,而是平臺的支持,這是因為ODBC產生于Windows操作系統,只有在Windows平臺下才能得到最好的

5、支持。最初的Java應用程序也是通過ODBC連接數據庫的,由于ODBC的API是使用C語言進行調用的,這就使得Java的許多優(yōu)秀特性無法充分發(fā)揮,比如平臺無關性、面向對象的特性等?;谶@些技術上的缺陷,Sun公司不失時機地推出了具有Java語言特性的獨有的數據庫解決方案JDBC。JDBC在繼承ODBC接口與具體數據庫無關的設計理念的基礎上,進一步利用了Java語言的平臺無關性,使得程序員可以輕松利用JDBC的API對數據庫進行操作,從而編寫出真正不依賴于具體數據庫、具體操作平臺的代碼。這些JDBC的API就是Java基礎類庫中的java.sql包,任何一個需要訪問數據庫的Java應用程序都需要

6、導入這個包。Java應用程序通過JDBC接口訪問數據庫有5種具體的底層處理機制。(1)JDBC-ODBC橋結合ODBC驅動程序一個JDBC-ODBC驅動程序提供了能夠訪問一個或多個ODBC驅動程序的JDBC API,它是一個本地的解決方案。這種方式將JDBC請求轉換為ODBC請求,因此在每一個數據庫的客戶端都必須安裝ODBC驅動,這種方式不適合遠程訪問數據庫。(2)原生API結合Java驅動程序這種方式同樣也是一種本地解決方案。它將對JDBC API的調用轉換為對Oracle、SQL Server、Sybase等其他數據庫客戶端API的調用,因而每個客戶端上要安裝對應于具體數據庫的驅動程序。(

7、3)網絡協議結合純Java驅動程序這種方式通過一個服務器將JDBC API調用轉換為中間網絡協議發(fā)送給網絡上的另一個服務器,然后再由這個服務器將這種中間網絡協議轉換為對指定數據庫系統的調用。這里,中間網絡協議起到一個讀取數據庫的中間件的作用,能夠連接許多類型的數據庫,而在客戶端上無須安裝特定的數據庫驅動,因而是最靈活的JDBC模式。這種驅動程序適合于通過Internet訪問數據庫,但要考慮安全認證的問題。(4)原生協議結合純Java驅動程序這種驅動程序一般由數據庫廠商實現。它將Java API的調用轉換為指定的數據庫系統使用的網絡協議。這種驅動程序使用的中間轉換最少,而且一般都是由數據庫廠商直

8、接提供的,因此使用起來穩(wěn)定性最高。(5)JDOJDO(Java Data Object)是Sun公司新推出的一個訪問數據庫的API,它定義了新的數據存取的模型。JDO的實現方式是在JDBC技術的基礎上進行封裝,將數據庫相關的JDBC連接細節(jié)封裝隱藏起來,使程序員在設計連接數據庫的應用程序時只需關注創(chuàng)建那些實現商業(yè)邏輯的類和用它們來表現數據源的數據,而這些類和數據源之間的映射則由專家來完成,這樣一來就給開發(fā)數據庫的程序員帶來了極大的便利??v觀上面這5種使用JDBC接口訪問數據庫的驅動機制,后3種驅動是比較理想的選擇,而前兩種驅動是用Java訪問數據庫時最常用的方式。一般來說,Java應用程序訪問

9、數據庫的過程(見圖8.1)如下。裝載數據庫驅動程序。通過JDBC建立數據庫連接。訪問數據庫,執(zhí)行SQL語句。斷開數據庫連接。圖8.1 JDBC的數據庫訪問機制JDBC的功能十分強大,而且得到了絕大部分數據庫廠商的支持,數據引擎的稱號對JDBC來說是當之無愧的。8.2 通過JDBC-ODBC訪問Oracle數據庫JDBC-ODBC橋作為JDBC API訪問具體數據庫的中間環(huán)節(jié),是使用JSP訪問數據庫常用的一個辦法。這里,我們以一個在Windows XP系統下訪問Oracle 10g的實例來講解如何在JSP中使用JDBC-ODBC橋結合ODBC驅動程序的機制來訪問數據庫。8.2.1 創(chuàng)建ODBC數

10、據源如果要通過ODBC訪問數據庫,就必須為建立好的數據庫添加一個數據源以便與應用程序交互。每一個ODBC數據源對應于某一個數據庫系統中一個指定的數據庫。比如要以SCOTT用戶身份訪問myorc數據庫中的emp表,這時,就要為數據庫myorc建立一個數據源。在Windows系統中為myorc數據庫建立一個ODBC數據源的步驟如下。(1)在控制面板的“管理工具”中,雙擊打開“數據源(ODBC)”,在彈出的【ODBC數據源管理器】對話框中,選擇【系統DSN】選項卡,如圖8.2所示,(2)單擊【添加】按鈕,彈出【創(chuàng)建新數據源】對話框,如圖8.3所示,在對話框中選擇“Oracle in OraDb10g

11、_home1”。(3)單擊【完成】按鈕,彈出Oracle ODBC Driver Configuration對話框,如圖8.4所示,在Data Source Name一欄中填入數據源名“myOracle_conn”;在TNS Service Name下拉列表框中選擇數據庫“MYORC”;在User欄中輸入用戶名“scott”。其他選項保持默認。(4)單擊Test Connection按鈕,測試當前設置是否能成功連接Oracle,在彈出的Oracle ODBC Driver Connect對話框中輸入以SCOTT身份登錄MYORC數據庫的密碼,如圖8.5所示。圖8.2 【ODBC數據源管理器】對

12、話框 圖8.3 選擇Oracle in OraDb10g_home1圖8.4 配置數據庫信息 圖8.5 輸入密碼(5)單擊OK按鈕,如果彈出如圖8.6所示的提示對話框,則說明我們已成功配置。(6)單擊【確定】按鈕,返回Oracle ODBC Driver Configuration對話框,繼續(xù)單擊OK按鈕,就會看到在【ODBC數據源管理器】對話框中添加了一個名為myOracle_conn的數據源,如圖8.7所示。圖8.6 配置成功的提示信息圖8.7 完成數據源myOracle_conn的創(chuàng)建工作(7)在圖8.7中單擊【確定】按鈕,至此ODBC數據源的創(chuàng)建工作結束。8.2.2 編寫JSP測試程序

13、既然已經完成了數據源myOracle_conn的創(chuàng)建工作,下面就要開始編寫訪問數據庫的JSP程序了。由于我們采用JDBC-ODBC橋的方式進行訪問,因此就不需要再安裝JDBC驅動了,因為JDBC-ODBC驅動程序是由JDK系統自帶的。下面的程序清單顯示了如何通過JDBC-ODBC橋來訪問數據庫。在Eclipse中創(chuàng)建一個J2EE項目,名稱為“odbc_test”,然后新建一個名為“Test_jdbc.jsp”的文件,輸入以下代碼。【代碼8.1】Test_jdbc.jsp<html><head><title>通過JDBC-ODBC橋訪問數據庫</titl

14、e></head><% page contentType="text/html;charset=GB2312"%><!-首先導入一些必要的package-><% page import="java.sql.*"%><body><CENTER><FONT SIZE=5 COLOR=blue>通過JDBC-ODBC橋訪問數據庫</FONT></CENTER><BR><HR><BR><table borde

15、r=1 align="center"><tr><td>員工號</td><td>姓名</td><td>工作性質</td><td>所屬領導編號</td><td>入職時間</td><td>薪資</td><td>獎金</td><td>部門編號</td></tr><%/加載驅動程序,下面的代碼為加載JDBD-ODBC驅動程序Class.forName(&quo

16、t;sun.jdbc.odbc.JdbcOdbcDriver");/用適當的驅動程序連接到數據庫,myOracle_conn是系統dsn名String url = "jdbc:odbc:myOracle_conn"String username = "scott"String password = "scott"/ 建立連接,類似于ASP中的創(chuàng)建數據庫聯接Connection con = DriverManager.getConnection(url, username, password);/創(chuàng)建一個JDBC聲明State

17、ment stmt = con.createStatement();/查詢記錄ResultSet rs = stmt.executeQuery("select * from emp");/輸出查詢結果while(rs.next() %><tr><td><%=rs.getInt(1)%></td><td><%=rs.getString(2)%></td><td><%=rs.getString(3)%></td><td><%=rs.ge

18、tInt(4)%></td><td><%=rs.getDate(5)%></td><td><%=rs.getInt(6)%></td><td><%=rs.getInt(7)%></td><td><%=rs.getInt(8)%></td></tr><%/ 關閉數據庫連接rs.close();con.close();%></table></body></html>這個JSP程序

19、用來從數據庫myorc中讀出所有的信息,并在瀏覽器中將這些信息以一張表的形式顯示出來。在Eclipse中啟動Tomcat服務器,在瀏覽器的地址欄中輸入:http:/localhost:8089/odbc_test/Test_jdbc.jsp運行這個JSP程序,結果如圖8.8所示。圖8.8 通過JDBC-ODBC橋訪問數據庫8.2.3 JDBC編程詳解上面這個JSP實例給我們展示了如何使用JDBC的編程語句對數據庫進行訪問。接下來我們將深入JDBC內部,詳細介紹它們的作用以及具體用法。1. 導入java.sql包所有與數據庫有關的對象和方法都在java.sql包中,包java.sql包含了用Ja

20、va操縱關系數據庫的類和接口。因此在使用JDBC的程序中必須要加入“import java.sql.*”。2. 加載驅動程序在JDBC連接到ODBC數據庫之前,必須要加載JDBC-ODBC橋驅動程序:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");這里,使用了Class類(java.lang包)中的方法forName,來裝入該驅動程序的類定義sun.jdbc.odbc.JdbcOdbcDriver,從而創(chuàng)建了該驅動程序的一個實例。3. 連接數據庫完成上述操作后,就可以連接一個特定的數據庫了。這需要創(chuàng)建Connection(java

21、.sql包)類的一個實例,并使用DriverManager(java.sql包)的方法getConnection來嘗試建立用url指定的數據庫的連接。下面是JDBC與數據源myOracle_conn相連接的代碼:String url = "jdbc:odbc:myOracle_conn"String username = "scott"String password = "scott"Connection con = DriverManager.getConnection(url, username, password);這里,jav

22、a.sql.Connection類用于管理JDBC與數據庫之間的連接,它還提供了對SQL語言的支持,以便操縱數據庫進行事務處理。java.sql.DriverManager類是驅動程序管理器,其方法getConnection用來建立與url指定的數據庫的連接,它的第一個參數是數據源的url,后面兩個參數分別為數據源的用戶名和密碼。數據源的url的作用是定位一個數據庫以便使驅動程序能夠找到這個數據庫并與其進行連接,它的格式如下:協議標識:驅動程序標識:數據庫標識其中:協議標識總是“jdbc”;驅動程序標識代表所使用的驅動程序協議名;數據庫標識是數據庫的定位方式,它根據驅動程序協議的不同而有所不同

23、。比如在ODBC的協議下,數據庫標識就是ODBC數據源的名稱,而在dbnet的協議下,它是一個表示數據庫位置的url。在我們這個實例中,采用JDBC-ODBC橋的方式連接數據庫,因而驅動程序標識為“odbc”,數據庫標識就是實例中創(chuàng)建的那個ODBC數據源myOracle_conn,由此方法getConnection中的第一個參數url就要設置為url=“jdbc:odbc:myOracle_conn”。4. 訪問數據庫連接到數據源MyOracle_conn以后就可以訪問數據庫了。這需要先用Connection類對象的createStatement方法從指定的數據庫連接得到一個Statement

24、(java.sql包)的實例,然后用這個實例的executeQuery方法來執(zhí)行一條SQL語句。代碼如下:Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery("select * from Users");這里,java.sql.Statement類用來向數據庫遞交查詢或修改請求。Statement.executeQuery()用來執(zhí)行一條SQL語句的查詢結果。如果要對數據庫中的記錄進行修改,則要使用Statement.updateQuery()方法。java.sql.ResultSe

25、t類用來保存SQL語句的執(zhí)行結果,還可以存取結果中的數據。對數據庫的查詢或修改等操作將返回一個包含了查詢結果的ResultSet對象。5. 獲取數據庫記錄中的字段值ResultSet對象是JDBC中比較重要的一個對象,幾乎所有的查詢和修改等操作都將數據作為ResultSet對象返回。Result包含任意數量的命名列,可以按名稱訪問這些列,它還包含一個或多個行,也可以按順序自上而下逐一訪問這些列。下面是訪問并顯示數據源MyOracle_conn的代碼:<%.while(rs.next()%><tr><td><%=rs.getInt(1)%><

26、/td><td><%=rs.getString(2)%></td><td><%=rs.getString(3)%></td><td><%=rs.getInt(4)%></td><td><%=rs.getDate(5)%></td><td><%=rs.getInt(6)%></td><td><%=rs.getInt(7)%></td><td><%=rs.get

27、Int(8)%></td></tr><%.%>這里,rs.next()方法用來得到數據結果中的下一條記錄。在進行前面的查詢操作之后,得到的ResultSet中的指針指向第一條記錄之前的一個位置,因此先要調用一次next方法使指針指向第一條記錄。Next方法返回一個boolean值,表示能否定位下一條記錄,如返回值為false,則表示不存在更多的記錄,否則就可以提取下一條記錄。rs.getString方法用來得到當前記錄中的某一字段的值,返回類型為String,其他的方法還有getFloat()、getInt()的等。注意,所要讀取的字段名應該與數據庫內

28、的相應字段名完全一致,包括大小寫也要一致。6. 關閉數據庫連接,釋放資源對數據庫的操作完成之后,要及時關閉ResultSet對象和數據庫連接對象Connection,從而釋放占用的資源,這就要用到close的方法。代碼如下:rs.close();con.close();這樣,對查詢結果使用完畢后及時關閉了ResultSet對象;在全部數據庫操作結束后及時關閉了Connection連接對象。8.3 使用JavaBean模式訪問數據庫JavaBeans和ActiveX控件一樣,可以通過封裝業(yè)務邏輯建立一整套可重復利用的對象庫。JSP對于在Web應用中集成JavaBeans組件提供了完善的支持,這種

29、支持不僅能縮短開發(fā)時間(可以直接利用經過測試和可信任的已有組件)、避免重復開發(fā),也為JSP應用帶來了更多的可伸縮性。JavaBeans組件可以用來執(zhí)行復雜的計算任務、或負責與數據庫的交互以及數據提取等,這里將以一個實例來介紹如何在JSP中利用JavaBeans通過JDBC-ODBC橋訪問客戶信息數據庫。通過前面章節(jié)對JavaBean的學習,我們已經能夠熟練地使用“JSP+JavaBean”的開發(fā)模式將復雜的、重復性的事務處理代碼封裝進JvaaBean中供JSP調用。在用JSP訪問數據庫時,每一次對數據庫進行操作時都要進行一系列相同的操作:設置驅動程序,連接數據庫,生成一條語句,進行SQL操作,

30、最后斷開連接。將這些操作全部放在JSP頁面中運行是很繁瑣的,因此完全可以把這些對數據庫的操作放到JavaBean中去。這樣當系統更換后臺的數據庫時,只需在JavaBean中改變驅動程序以及連接方法即可,從而能夠提高代碼的可重用性和運行時的效率。下面我們來將8.2.2小節(jié)中的實例改寫為“JSP+JavaBean”的模式?!敬a8.2】odbc_javabean.jsp<html><head><title>通過JDBC-ODBC橋訪問數據庫</title></head><% page contentType="text/h

31、tml;charset=GB2312" %><% page import="java.sql.*" %><jsp:useBean id="jdbcbean" class=".JdbcBean" /><body><CENTER><FONT SIZE=5 COLOR=blue>通過JDBC-ODBC橋訪問數據庫,其中使用了JavaBean。</FONT></CENTER><BR><HR><BR><t

32、able border=1 align="center"><tr><td>員工號</td><td>姓名</td><td>工作性質</td><td>所屬領導編號</td><td>入職時間</td><td>薪資</td><td>獎金</td><td>部門編號</td></tr><%ResultSet rs = jdbcbean.executeQuery(

33、"select * from emp");while(rs.next()%><tr><td><%=rs.getInt(1)%></td><td><%=rs.getString(2)%></td><td><%=rs.getString(3)%></td><td><%=rs.getInt(4)%></td><td><%=rs.getDate(5)%></td><td>&l

34、t;%=rs.getInt(6)%></td><td><%=rs.getInt(7)%></td><td><%=rs.getInt(8)%></td></tr><%rs.close();jdbcbean.closeDB();%></table></body>【代碼8.3】JdbcBean.javapackage ;import java.sql.*;public class JdbcBeanConnection con = null;ResultSet rs

35、 = null;/實例化、裝載JDBC驅動程序public JdbcBean()tryClass.forName("sun.jdbc.odbc.JdbcOdbcDriver");catch(ClassNotFoundException e) /返回查詢后的數據集public ResultSet executeQuery(String sql)String url = "jdbc:odbc:MyOracle_conn"String username = "scott"String password = "scott"

36、trycon = DriverManager.getConnection(url, username, password);Statement stmt = con.createStatement();rs = stmt.executeQuery(sql);catch(SQLException e) return rs;/關閉數據庫public void closeDB()tryrs.close();con.close();catch(SQLException e)我們在JavaBean程序JdbcBean.java中定義了3個方法函數。其中構造函數JdbcBean()用來裝載JDBC-ODB

37、C橋驅動程序;函數executeQuery(String sql)用來執(zhí)行對數據源MyOracle_conn的查詢操作,并將查詢所得的數據結果以ResultSet對象的形式返回;函數closeDB()用來關閉數據源和連接,釋放資源。JSP程序odbc_javabean.jsp中調用了這個JavaBean,并將對數據源MyOracle_conn的查詢結果信息顯示出來。運行這個JSP程序,效果如圖8.9所示。圖8.9 使用JavaBean通過JDBC-ODBC橋訪問數據庫可以看出,JSP是一種開發(fā)Web應用的理想構架,利用跨平臺運行的JavaBeans組件,JSP為分離處理邏輯及顯示樣式提供了卓越

38、的解決方案。8.4 直接使用JDBC訪問數據庫除了通過JDBC-ODBC橋的方式來訪問數據庫外,我們也可以直接使用JDBC來訪問這些數據庫。這樣,訪問的流程就可以簡化為:JSPJDBC驅動程序數據庫。當然,這還需要為指定的數據庫安裝相應的JDBC驅動程序。下面我們以在Windows XP系統下訪問Oracle 10g數據庫為例,講解如何在JSP中直接使用JDBC來訪問數據庫。1. 安裝JDBC驅動程序在Oracle安裝目錄Oraclejdbclib下,找到classes12.jar文件,它就是用于連接Oracle數據庫的JDBC驅動程序。將其拷貝到Tomcat安裝目錄中的“C:Tomcat 5

39、.5commonlib”目錄下。也可以在Windows系統的環(huán)境變量CLASSPATH中指定此jar文件。重新啟動Tomcat后,這個驅動程序即可生效。2. 編寫JSP程序JSP程序的具體代碼如下?!敬a8.4】jdbc.jsp<html><head><title>使用JDBC直接訪問數據庫</title></head><% page contentType="text/html;charset=GB2312"%><% page import="java.sql.*"%>

40、<body><CENTER><FONT SIZE=5 COLOR=blue>使用JDBC直接訪問數據庫</FONT></CENTER><BR><HR><BR><table border=1 align="center"><tr><td>員工號</td><td>姓名</td><td>工作性質</td><td>所屬領導編號</td><td>入職時間<

41、;/td><td>薪資</td><td>獎金</td><td>部門編號</td></tr><%Class.forName("oracle.jdbc.driver.OracleDriver");Connection con = DriverManager.getConnection("jdbc:oracle:thin:localhost:1521:myorc", "scott", "scott");Statement st

42、mt = con.createStatement();ResultSet rs = stmt.executeQuery("select * from emp");while(rs.next() %><tr><td><%=rs.getInt(1)%></td><td><%=rs.getString(2)%></td><td><%=rs.getString(3)%></td><td><%=rs.getInt(4)%></td

43、><td><%=rs.getDate(5)%></td><td><%=rs.getInt(6)%></td><td><%=rs.getInt(7)%></td><td><%=rs.getInt(8)%></td></tr><%rs.close();con.close();%></table></body></html>運行這個JSP程序,結果如圖8.10所示。圖8.10 直接使用JDBC

44、訪問Oracle數據庫3. 程序說明這個JSP程序與前面的代碼8.1“Test_jdbc.jsp”僅有兩處區(qū)別,一處是加載驅動程序的方法Class.forName()中的參數改為了“oracle.jdbc.driver.OracleDriver”,這個字符串代表的是Oracle的驅動程序。另一處是在與Oracle數據庫建立連接時,使用了:Connection con = DriverManager.getConnection( "jdbc:oracle:thin:localhost:1521:myorc", "scott", "scott&qu

45、ot;);這里,連接方式也發(fā)生了變化,不用通過ODBC數據源去連接,而是使用了一個URL指定要訪問的數據庫的位置。8.5 使用連接池訪問數據庫JDBC作為一種數據庫訪問技術,具有簡單易用的優(yōu)點。但使用這種模式進行Web應用程序開發(fā),存在很多問題。首先,每一次Web請求都要建立一次數據庫連接。建立連接是一個費時的活動,每次都得花費一定的時間,而且系統還要分配內存資源。這個時間對于一次或幾次數據庫操作,或許感覺不出系統有多大的開銷??墒菍τ诂F在的Web應用,尤其是大型電子商務網站,同時有幾百人甚至幾千人在線是很正常的事。在這種情況下,頻繁地進行數據庫連接操作勢必占用很多的系統資源,網站的響應速度必

46、定下降,嚴重時甚至會造成服務器的崩潰。這就是制約某些電子商務網站發(fā)展的技術瓶頸問題。其次,對于每一次數據庫連接,使用完后都得斷開。否則,如果程序出現異常而未能關閉,將會導致數據庫系統中的內存泄漏,最終將不得不重啟數據庫。還有,這種開發(fā)不能控制被創(chuàng)建的連接對象數,系統資源會被毫無顧忌地分配出去,如連接過多,也可能導致內存泄漏,服務器崩潰。由上面的分析可以看出,問題的根源就在于對數據庫連接資源的低效管理。而在共享資源的創(chuàng)建中,有一個很著名的設計模式,即資源池(Resource Pool)。該模式正是為了解決資源的頻繁分配、釋放所造成的問題。為解決上述問題,同樣也可以采用數據庫連接池(Connect

47、ion Pool)技術。下面就來詳細介紹數據庫連接池。8.5.1 連接池的工作原理數據庫連接池的基本思想就是為數據庫連接建立一個“緩沖池”。預先在緩沖池中放入一定數量的連接,當需要建立數據庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。我們可以通過設定連接池最大連接數來防止系統無限度地與數據庫連接。更為重要的是,我們可以通過連接池的管理機制監(jiān)視數據庫的連接的數量及使用情況,為系統開發(fā)、測試和性能調整提供依據。其工作原理如圖8.11所示。圖8.11 數據庫連接池的原理(1)一個數據庫連接池應具備以下的功能:l 能夠存儲n個有效的連接。l 能夠為其他方法提供有效連接。l 能夠驗證連接是

48、否正常。l 能夠取回使用過的連接。l 如果當前連接池中沒有可用連接,就創(chuàng)建新的連接提供給應用程序。l 連接池關閉時關閉所有連接。(2)有時候在一個應用程序需要訪問不同的數據庫,這就需要為每一個數據庫都建立一個連接池,其實最好的辦法是設計一個連接池管理器專門用于連接池的管理,這個管理器應該有以下的功能:l 根據初始設置創(chuàng)建不同的連接池。l 能夠存儲多個不同的連接池,每個連接池存儲一類連接。l 根據不同的請求提供不同連接池中的連接。l 將使用完的連接放回到相應的連接池中去。l 關閉所有連接池中的連接8.5.2 實例:在JSP中使用連接池訪問數據庫下面我們來看一個例子,在這個例子中,我們要用到兩個數

49、據庫:MyOracle_conn(Oracle數據庫)和testAccess(Access數據庫)。將創(chuàng)建數據庫的連接池,并用連接池管理器對這兩個連接池進行管理。在JSP程序中通過對連接池管理器的調用獲取這兩個數據庫中的信息。由于我們以前沒有創(chuàng)建testAccess數據庫,所以應首先創(chuàng)建它并進行JDBC配置。1. 創(chuàng)建Access數據庫并進行配置(1)在桌面上選擇“開始”“所有程序”“Microsoft Office”“Microsoft Office Access 2003”命令,將出現如圖8.12所示的對話框。新建一個名為“mydb.mdb”的數據庫。圖8.12 新建“mydb.mdb”數

50、據庫(2)單擊【創(chuàng)建】按鈕,就會出現名為【mydb : 數據庫】的窗口,如圖8.13所示。圖8.13 數據表的設計界面(3)雙擊【使用設計器創(chuàng)建表】,按照圖8.14來設計一個數據表,表名為“student”。(4)最后為student表添加幾條記錄,如圖8.15所示。將這些數據信息保存,然后關閉Access,完成數據表的創(chuàng)建工作。接下來就要創(chuàng)建ODBC數據源了。圖8.14 設計數據表圖8.15 為表Users添加數據信息2. 創(chuàng)建ODBC數據源要訪問上面創(chuàng)建的mydb數據庫中的student表,就要為數據庫mydb建立一個數據源。創(chuàng)建方法與8.2.1小節(jié)創(chuàng)建Oracle數據庫ODBC數據源的操

51、作類似,步驟如下。(1)在控制面板的“管理工具”中,雙擊“數據源(ODBC)”,選擇“系統DSN”。(2)單擊“添加”按鈕,在彈出的【創(chuàng)建新數據源】對話框中選擇“Microsoft Access Driver(*.mdb)”,如圖8.16所示。圖8.16 選擇Microsoft Access Driver(3)單擊【完成】按鈕,彈出【ODBC Microsoft Access安裝】對話框,在【數據源名】一欄中填入數據源名“Access_Database”,再單擊【選擇】按鈕。在彈出的【選擇數據庫】對話框中找到所需的數據庫文件mydb.mdb,如圖8.17所示。圖8.17 找到所需的數據庫文件m

52、ydb.mdb(4)單擊【確定】按鈕,即可將數據源Access_Database映射到數據庫文件mydb.mdb,如圖8.18所示。最后單擊【確定】按鈕完成配置。圖8.18 將數據源Access_Database映射到數據庫文件mydb.mdb3. 用JavaBean實現連接池類DBConnPool下面給出連接池類的主要屬性及所要實現的方法?!敬a8.5】DBConnPool.javapackage ;import java.sql.*;import java.util.*;/* 連接池類。能夠根據要求創(chuàng)建新連接,直到最大連接數為止 */public class DBConnPool priv

53、ate int inUse = 0; / 實際使用中的連接數private Vector connections = new Vector(); / 空閑連接private String poolname; / 連接池名private String dbid; / 數據庫標識private String drivername; / 數據庫驅動程序名private String username; / 數據庫用戶名private String passwd; / 數據庫密碼private int maxconn; / 連接池里允許存在的最大連接數public DBConnPool(String

54、poolname, String drivername, String dbid,String username, String passwd, int maxconn) this.poolname = poolname; / 連接池名this.dbid = dbid; / 數據庫標識this.drivername = drivername; / 驅動程序名this.username = username; / 數據庫用戶名this.passwd = passwd; / 數據庫訪問密碼this.maxconn = maxconn; /最大連接數/* 將連接返回給連接池 */public syn

55、chronized void releaseConnection(Connection con) connections.addElement(con); / 將指定連接加入到向量末尾inUse-; / 連接數減1/* 從連接池得到一個連接 */public synchronized Connection getConnection() Connection con = null;if(connections.size() > 0) / 從連接列表中獲得第一個連接con = (Connection)connections.elementAt(0);connections.removeEl

56、ementAt(0);/ 如果此連接已關閉,則繼續(xù)獲取try if(con.isClosed()con = getConnection(); catch(Exception ex) ex.printStackTrace();/ 如果實際使用的連接小于最大連接數,就新創(chuàng)建一個連接else if (maxconn = 0 | inUse < maxconn) con = newConnection();if(con != null) inUse+; / 連接數加1 return con; / 返回一個連接 /* 創(chuàng)建新的連接 */ private Connection newConnecti

57、on() Connection con = null; try Class.forName(drivername); / 加載驅動程序 / 建立連接 con = DriverManager.getConnection(dbid, username, passwd); catch(Exception e) e.printStackTrace(); return null; return con; / 返回該連接 /* 關閉所有連接 */ public synchronized void closeConn() Enumeration allConnections = connections.el

58、ements(); while(allConnections.hasMoreElements() Connection con = (Connection)allConnections.nextElement(); try con.close(); catch(SQLException e) e.printStackTrace(); connections.removeAllElements(); 在上面這個連接池類中,有一個向量connections用于存儲連接對象,它所存儲的就是空閑狀態(tài)的可用連接;應用程序通過getConnection()方法得到連接,如果此時有空閑的可用連接,那么就將連接向量的第一個連接對象返回,并將這個對象從隊列中刪去。如果此時沒有空閑連接,但是連接數又沒有達到連接總數的上限,那么就使用newConnection()創(chuàng)建一個新的連接返回給應用程序。如果連接數已經達到上限,那么就返回空指針,要求應用程序等待。在將連接對象交給外部程序之前,連接池還要通過isClosed()方法判斷該連接是否已經中斷,如果是的話,還應該繼續(xù)調用getConnection()方法得到一個可用連接。在將一個可用連接提供給應用程序后,要將使用中的連接數inUse加1。

溫馨提示

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

評論

0/150

提交評論