林晶晶 王夢(mèng)佳 楊文暉
【摘要】隨著Java Web的迅速發(fā)展,數(shù)據(jù)庫(kù)連接已成為應(yīng)用程序開(kāi)發(fā)中的主要問(wèn)題之一,連接數(shù)據(jù)庫(kù)的效率也成為直接影響應(yīng)用程序執(zhí)行效率的因素。本文以O(shè)racle數(shù)據(jù)庫(kù)系統(tǒng)為例,詳細(xì)介紹了在Java程序中訪問(wèn)數(shù)據(jù)庫(kù)的傳統(tǒng)數(shù)據(jù)庫(kù)的連接方法和數(shù)據(jù)庫(kù)連接池技術(shù),并對(duì)此進(jìn)行了分析和比較。
【關(guān)鍵詞】Java;數(shù)據(jù)庫(kù);JDBC;連接池
1.引言
隨著Java Web技術(shù)和計(jì)算機(jī)網(wǎng)絡(luò)的迅速發(fā)展,人們對(duì)網(wǎng)絡(luò)資源的共享提出了更高的要求。在網(wǎng)絡(luò)環(huán)境中,對(duì)于數(shù)據(jù)的訪問(wèn)往往都是非常頻繁的。在Java Web的應(yīng)用程序開(kāi)發(fā)中使用Java訪問(wèn)數(shù)據(jù)庫(kù),是整個(gè)應(yīng)用程序開(kāi)發(fā)過(guò)程中的主要問(wèn)題之一。下面就將以O(shè)racle數(shù)據(jù)庫(kù)系統(tǒng)為例,闡述在Java程序中訪問(wèn)數(shù)據(jù)庫(kù)的傳統(tǒng)的數(shù)據(jù)庫(kù)連接方法和數(shù)據(jù)庫(kù)連接池技術(shù)。
2.傳統(tǒng)的數(shù)據(jù)庫(kù)連接方法
2.1 JDBC簡(jiǎn)介
JDBC是用java連接數(shù)據(jù)庫(kù)最為傳統(tǒng)的方法,下面詳細(xì)闡述在java程序中它具體是怎么實(shí)現(xiàn)的。
2.1.1 JDBC概念
JDBC的全稱(chēng)是Java Database Connectivity,即Java數(shù)據(jù)庫(kù)連接。JDBC是標(biāo)準(zhǔn)的Java訪問(wèn)數(shù)據(jù)庫(kù)的API。JDBC定義了數(shù)據(jù)庫(kù)的連接、SQL語(yǔ)句的執(zhí)行以及查詢結(jié)果集的遍歷等。它由一組用Java編程語(yǔ)言編寫(xiě)的類(lèi)和接口組成,位于包java.sql下面,如java.sql.Connection,java.sql.Statement,java.sql.ResultSet等。JDBC提供給Java程序使用的,它將各種數(shù)據(jù)庫(kù)的差異對(duì)Java程序屏蔽了起來(lái),Java程序可以使用同樣的可移植的接口訪問(wèn)數(shù)據(jù)庫(kù),使Java的應(yīng)用程序屏蔽了數(shù)據(jù)庫(kù)領(lǐng)域,同時(shí)保持了Java語(yǔ)言的“一次編寫(xiě),各處運(yùn)行”的優(yōu)點(diǎn)。
2.1.2 JDBC的結(jié)構(gòu)
JDBC主要有兩類(lèi)接口:面向程序開(kāi)發(fā)人員的JDBC API和面向JDBC驅(qū)動(dòng)程序的JDBC DRIVER API。前者是開(kāi)發(fā)人員用來(lái)編寫(xiě)前端應(yīng)用程序的,后者是由數(shù)據(jù)庫(kù)廠商開(kāi)發(fā)的。
(1)JDBC API由兩個(gè)部分組成,一個(gè)是核心的API,其類(lèi)包路徑為javax.sql,這是J2EE的一部分,它具有可滾動(dòng)的結(jié)果集、批量更新的實(shí)現(xiàn)類(lèi)。另一個(gè)是擴(kuò)展的API,其類(lèi)包的路徑為javax.sql,這是J2EE的一部分,它具有訪問(wèn)JNDI資源、分布式事務(wù)等實(shí)現(xiàn)類(lèi)。四個(gè)重要的JDBC API接口:
Java.sql.DriverManager:用于加載驅(qū)動(dòng)程序和建立新的數(shù)據(jù)庫(kù)鏈接。
Java.sql.Connection:完成對(duì)某一指定數(shù)據(jù)庫(kù)的鏈接。
Java.sql.Statement:管理在指定數(shù)據(jù)庫(kù)連接上的SQL語(yǔ)句的執(zhí)行。
Java.sql.ResultSet:用來(lái)從數(shù)據(jù)庫(kù)返回的結(jié)果集。
(2)JDBC Driver API是面向驅(qū)動(dòng)程序開(kāi)發(fā)商的編程接口。
JDBC驅(qū)動(dòng)程序根據(jù)其實(shí)現(xiàn)方式分為4種類(lèi)型:
JDBC-ODBC bridgedriver(JDBC-ODBC橋接方式);
Native-API Partly-Java driver(本地API方式);
Net-ProtocolAll-Java driver(網(wǎng)絡(luò)協(xié)議方式);
Native-Protocol All-Java driver(本地協(xié)議方式)。
這四種方式用于不同的場(chǎng)合,它們的運(yùn)行效果也不相同。選擇合適和正確的JDBC驅(qū)動(dòng)程序,是提高數(shù)據(jù)庫(kù)訪問(wèn)效率時(shí)應(yīng)該考慮的一個(gè)重要因素。
2.1.3 JDBC的功能
(1)JDBC的基本功能如下:連接數(shù)據(jù)庫(kù);向數(shù)據(jù)庫(kù)執(zhí)行查詢操作;向數(shù)據(jù)庫(kù)執(zhí)行更新操作;向數(shù)據(jù)庫(kù)執(zhí)行插入操作;向數(shù)據(jù)庫(kù)執(zhí)行刪除操作;執(zhí)行存儲(chǔ)過(guò)程。
(2)JDBC支持?jǐn)?shù)據(jù)庫(kù)訪問(wèn)的兩層和三層模型。兩層模型是Java應(yīng)用程序或Apple直接與數(shù)據(jù)庫(kù)進(jìn)行交互操作的模型;三層模型是在應(yīng)用與數(shù)據(jù)庫(kù)之間,有一個(gè)中間應(yīng)用服務(wù)器。
2.2 JDBC的實(shí)現(xiàn)
通過(guò)JDBC可以用Java訪問(wèn)遠(yuǎn)程oracle數(shù)據(jù)庫(kù)和本地oracle數(shù)據(jù)庫(kù),方法是一樣的。但在加載驅(qū)動(dòng)包是應(yīng)該注意要根據(jù)所使用的相應(yīng)的JDK環(huán)境來(lái)加載相應(yīng)的包。需要注意的是
classes12.jar:for Java 1.2 and 1.3
ojdbc14.jar:for Java 1.4 and 1.5
ojdbc5.jar:for Java 1.5
ojdbc6.jar:for Java 1.6
本文用的是Java 1.6,所以加載的是ojdbc6.jar這個(gè)包。
具體實(shí)現(xiàn)的部分代碼如下:
這里的url的格式應(yīng)該為:
String url= "jdbc:oracle:thin:@"+ip+":"+port+":"+dbName;
其中ip為要訪問(wèn)的數(shù)據(jù)庫(kù)的IP地址,port為要訪問(wèn)的數(shù)據(jù)庫(kù)的端口號(hào),dbName為要訪問(wèn)的數(shù)據(jù)庫(kù)名。
3.數(shù)據(jù)庫(kù)連接池的連接技術(shù)
3.1 數(shù)據(jù)庫(kù)連接池簡(jiǎn)介
數(shù)據(jù)庫(kù)連接池(Connection pool),它是程序啟動(dòng)時(shí)建立足夠的數(shù)據(jù)庫(kù)連接,并將這些連接組成一個(gè)連接池,由程序動(dòng)態(tài)地對(duì)池中的連接進(jìn)行申請(qǐng)、使用、釋放。
數(shù)據(jù)庫(kù)連接池基本的思想是在系統(tǒng)初始化的時(shí)候,將數(shù)據(jù)庫(kù)連接作為對(duì)象存儲(chǔ)在內(nèi)存中,當(dāng)用戶需要訪問(wèn)數(shù)據(jù)庫(kù)時(shí),并非要建立一個(gè)新的連接,而是從連接池中取出一個(gè)已建立的空閑連接對(duì)象。使用完畢后,用戶也并非要將連接關(guān)閉,而是將連接放回連接池中,以供下一個(gè)請(qǐng)求訪問(wèn)使用。而連接的建立、斷開(kāi)都由連接池自身來(lái)管理。同時(shí),還可以通過(guò)設(shè)置連接池的參數(shù)來(lái)控制連接池中的初始連接數(shù)、連接的上下限數(shù)以及每個(gè)連接的最大使用次數(shù)、最大空閑時(shí)間等等。也可以通過(guò)其自身的管理機(jī)制來(lái)監(jiān)視數(shù)據(jù)庫(kù)連接的數(shù)量、使用情況等。
3.2 數(shù)據(jù)庫(kù)連接池影響因素
(1)最小連接數(shù):是連接池一直保持的數(shù)據(jù)庫(kù)連接。(2)最大連接數(shù):是連接池能申請(qǐng)的最大連接數(shù)。(3)最小連接數(shù)與最大連接數(shù)相差太大:那么最先的連接請(qǐng)求將會(huì)獲利,之后超過(guò)最小連接數(shù)量的連接請(qǐng)求等價(jià)于建立一個(gè)新的數(shù)據(jù)庫(kù)連接。
3.3 數(shù)據(jù)庫(kù)連接池運(yùn)行機(jī)制
(1)從連接池獲取或者創(chuàng)建可使用的連接。(2)使用完畢之后,把所使用的連接返還給連接池。(3)在系統(tǒng)關(guān)閉前,斷開(kāi)所有連接并釋放連接占用的系統(tǒng)資源。(4)還能夠處理無(wú)效連接,并且能夠限制連接池中的連接總數(shù)不低于某個(gè)預(yù)定值和不超過(guò)某個(gè)預(yù)定值。
3.4 數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn)
在Java中常用的數(shù)據(jù)庫(kù)連接池有C3P0、Proxool、DBCP、BoneCP、Druid、Tomcat jdbc pool等等。本文運(yùn)用的是Tomcat jdbc pool。
Tomcat jdbc pool是Tomcat7新的連接池。Tomcat 在7.0以前的版本都是使用commons-dbcp作為連接池的實(shí)現(xiàn),但是Tomcat從7.0開(kāi)始引入一個(gè)新的模塊:Tomcat jdbc pool。Tomcat jdbc pool可在Tomcat中直接使用,也可以在獨(dú)立的應(yīng)用中使用。若tomcat jdbc pool在java中單獨(dú)使用,加入tomcat-jdbc.jar和tomcat-juli.jar這兩個(gè)包就可以了;若作為數(shù)據(jù)源使用的話,就要借助于Spring框架,用它來(lái)管理tomcat jdbc-pool的連接。在工程中還要導(dǎo)入三個(gè)包:spring-contex-3.2.2.RELEASE.jar, spring-core-3.2.2.RELEASE.jar,org.springframework.beans-3.1.0.M1.jar.還要將配置好的數(shù)據(jù)源文件DSPoolAppContext.xml放入相應(yīng)的目錄下。這樣工程才可以運(yùn)行。下面以作為數(shù)據(jù)源使用來(lái)具體說(shuō)明。
(1)DSPoolAppContext.xml配置文件的部分代碼。
(2)在java中使用數(shù)據(jù)源的代碼。
4.傳統(tǒng)數(shù)據(jù)庫(kù)連接的方法與數(shù)據(jù)庫(kù)連接池技術(shù)的比較
JDBC作為一種數(shù)據(jù)庫(kù)訪問(wèn)技術(shù),具有簡(jiǎn)單易用的優(yōu)點(diǎn)。但使用這種方式進(jìn)行Web應(yīng)用程序開(kāi)發(fā),存在很多問(wèn)題:首先,每一次Web請(qǐng)求都要建立一次數(shù)據(jù)庫(kù)連接。建立連接是一個(gè)費(fèi)時(shí)的活動(dòng),而且系統(tǒng)還要分配內(nèi)存資源。這個(gè)時(shí)間對(duì)于一次或幾次數(shù)據(jù)庫(kù)操作,或許感覺(jué)不出系統(tǒng)有多大的開(kāi)銷(xiāo)。可是對(duì)于現(xiàn)在的Web應(yīng)用,尤其是大型電子商務(wù)網(wǎng)站,同時(shí)有幾百人甚至幾千人在線是很正常的事。在這種情況下,頻繁的進(jìn)行數(shù)據(jù)庫(kù)連接操作勢(shì)必占用很多的系統(tǒng)資源,網(wǎng)站的響應(yīng)速度必定下降。還有,這種開(kāi)發(fā)不能控制被創(chuàng)建的連接對(duì)象數(shù),系統(tǒng)資源會(huì)被毫無(wú)顧及的分配出去。因此為了提高數(shù)據(jù)庫(kù)的連接效率而采用了數(shù)據(jù)庫(kù)連接池技術(shù)。使用數(shù)據(jù)庫(kù)連接池的好處有:資源重用;更快的系統(tǒng)響應(yīng)時(shí)間;統(tǒng)一的連接管理,避免數(shù)據(jù)庫(kù)連接泄漏。所以使用數(shù)據(jù)庫(kù)連接技術(shù)可以解決傳統(tǒng)數(shù)據(jù)庫(kù)連接所出現(xiàn)的問(wèn)題。另外本文用到的連接池是Tomcat7.0中的tomcat jdbc pool,而它又具有以下特點(diǎn):它近乎兼容dbcp,性能更高;通過(guò)異步方式獲取連接;支持高并發(fā)應(yīng)用環(huán)境;比較簡(jiǎn)單;有更好的空閑連接機(jī)制等等。
5.總結(jié)
本文以O(shè)racle數(shù)據(jù)庫(kù)系統(tǒng)為例,闡述了在Java程序中訪問(wèn)數(shù)據(jù)庫(kù)的傳統(tǒng)的數(shù)據(jù)庫(kù)連接方法和數(shù)據(jù)庫(kù)連接池技術(shù)并進(jìn)行了分析比較。但本文中仍存在一些不足的地方,接下來(lái)的工作是通過(guò)更多的測(cè)試來(lái)不斷完善。
參考文獻(xiàn)
[1]羅榮,唐學(xué)兵.基于JDBC的數(shù)據(jù)庫(kù)連接池的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2004.
[2]何洪舟.Java程序中訪問(wèn)Oracle數(shù)據(jù)庫(kù)的技術(shù)分析與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2007.
[3]陳虹君.Java Web與數(shù)據(jù)庫(kù)連接池技術(shù)的應(yīng)用研究與實(shí)踐[D].2008.
[4]李剛.Java數(shù)據(jù)庫(kù)技術(shù)詳解[M].北京工業(yè)出版社,2010.
[5]百度百科.[EB/OL].http://baike.baidu.com/view/84055.htm?fr=Aladdin.
[6]Apache Tomcat 7官網(wǎng).The Tomcat JDBC Connection Pool. https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html.
作者簡(jiǎn)介:林晶晶(1986—),女,甘肅臨洮人,成都理工大學(xué)信息科學(xué)與技術(shù)學(xué)院碩士研究生在讀,研究方向:計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)用技術(shù)。