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