亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

JDBC數據庫連接池 Statment

系統 2083 0

1.前言
數據庫應用,在許多軟件系統中經常用到,是開發中大型系統不可缺少的輔助。但如果 對數據庫資源沒有很好地管理(如:沒有及時回收數據庫的游標(ResultSet)、Statement、連接 (Connection)等資源),往往會直接導致系統的穩定。這類不穩定因素,不單單由數據庫或者系統本身一方引起,只有系統正式使用后,隨著流量、用 戶的增加,才會逐步顯露。
在基于Java開發的系統中,JDBC是程序員和數據庫打交道的主要途徑,提供了完備的數據庫操作方法接口。但考慮 到規范的適用性,JDBC只提供了最直接的數據庫操作規范,對數據庫資源管理,如:對物理連接的管理及緩沖,期望第三方應用服務器 (Application Server)的提供。
本文,以JDBC規范為基礎,介紹相關的數據庫連接池機制,并就如果以簡單的方式,實現有 效地管理數據庫資源介紹相關實現技術。

 2.連接池技術背景
2.1 JDBC
JDBC是一個規范,遵循JDBC接口規 范,各個數據庫廠家各自實現自己的驅動程序(Driver),如下圖所示:

應用在獲取數據庫連接時,需要以URL的方式指定是那種類型的Driver,在獲得特定的連接后,可按照固定的接口操作不同類型的數據庫,如: 分別獲取Statement、執行SQL獲得ResultSet等,如下面的例子 :

import java.sql.*;
…
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection dbConn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:oracle","username","password");
Statement st = dbConn.createStatement();
ResultSet rs = st.executeQuery("select * from demo_table");

…some data source operation in here

rs.close();
st.close();
dbConn.close();

在完成數據操作后,還一定要關閉所有涉及到的數據庫資源。這雖然對應用程序的邏輯沒有任何影響,但是關鍵的操作。上面是個簡單的例子,如果攙和 眾多的if-else、exception,資源的管理也難免百密一疏。如同C中的內存泄漏問題,Java系統也同樣會面臨崩潰的惡運。所以數據庫資源的 管理依賴于應用系統本身,是不安全、不穩定的一種隱患。

2.2 JDBC連接池
在標準JDBC對應用的接口中,并沒有提供資源的管理方法。所以,缺省的資源管理由應用自己負責。雖然在 JDBC規范中,多次提及資源的關閉/回收及其他的合理運用。但最穩妥的方式,還是為應用提供有效的管理手段。所以,JDBC為第三方應用服務器 (Application Server)提供了一個由數據庫廠家實現的管理標準接口:連接緩沖(connection pooling)。引入了連接池( Connection Pool )的概念 ,也就是以緩沖池的機制管理數據庫的資源。

JDBC最常用的資源有三類:
— Connection: 數據庫連接。
— Statement: 會話聲明。
— ResultSet: 結果集游標。

分別存在以下的關系 :

這是一種“爺—父—子”的關系,對Connection的管理,就是對 數據庫資源的管理。舉個例子: 如果想確定某個數據庫連接(Connection)是否超時,則需要確定其(所有的)子Statement是否超時,同樣,需要確定所有相關的 ResultSet是否超時;在關閉Connection前,需要關閉所有相關的Statement和ResultSet。
因此,連接池 (Connection Pool)所起到的作用,不僅僅簡單地管理Connection,還涉及到 Statement和ResultSet。

2.3 連接池(ConnectionPool)與資源管理
ConnectionPool以緩沖池的機制,在一定數量上限范圍內, 控制管理Connection,Statement和ResultSet。任何數據庫的資源是有限的,如果被耗盡,則無法獲得更多的數據服務。
 在大多數情況下,資源的耗盡不是由于應用的正常負載過高,而是程序原因。
在實際工作中,數據資源往往是瓶頸資源,不同的應用都會訪問同一數據 源。其中某個應用耗盡了數據庫資源后,意味其他的應用也無法正常運行。因此,ConnectionPool的第一個任務是限制:每個應用或系統可以擁有的 最大資源。也就是確定連接池的大小(PoolSize)。
ConnectionPool的第二個任務:在連接池的大小(PoolSize)范 圍內,最大限度地使用資源,縮短數據庫訪問的使用周期。許多數據庫中,連接(Connection)并不是資源的最小單元,控制Statement資源比 Connection更重要。以Oracle為例:
每申請一個連接(Connection)會在物理網絡(如 TCP/IP網絡)上建立一個用于通訊的連接,在此連接上還可以申請一定數量的Statement。同一連接可提供的活躍Statement數量可以達到 幾百。 在節約網絡資源的同時,縮短了每次會話周期(物理連接的建立是個費時的操作)。但在一般的應用中,多數按照2.1范例操作,這樣有10個程序調用,則會產 生10次物理連接,每個Statement單獨占用一個物理連接,這是極大的資源浪費。 ConnectionPool可以解決這個問題,讓幾十、幾百個Statement只占用同一個物理連接, 發揮數據庫原有的優點。
通過 ConnectionPool對資源的有效管理,應用可以獲得的Statement總數到達 :

(并發物理連接數)×(每個連接可提供的Statement數量)

例如某種數據庫可同時建立的物理連接數為 200個,每個連接可同時提供250個Statement,那么ConnectionPool最終為應用提供的并發Statement總數為: 200 × 250 = 50,000個。這是個并發數字,很少有系統會突破這個量級。所以在本節的開始,指出資源的耗盡與應用程序直接管理有關。
對資 源的優化管理,很大程度上依靠數據庫自身的JDBC Driver是否具備。有些數據庫的JDBC Driver并不支持Connection與Statement之間的邏輯連接功能,如SQLServer,我們只能等待她自身的更新版本了。
 對資源的申請、釋放、回收、共享和同步,這些管理是復雜精密的。所以,ConnectionPool另一個功能就是,封裝這些操作,為應用提供簡單的,甚 至是不改變應用風格的調用接口。

 3.簡單JDBC連接池的實現
根據第二章中原理機制,Snap- ConnectionPool(一種簡單快速的連接池工具,可在 www.snapbug.net 下載)按照部分的JDBC規范,實現了連接池所具備的對數據庫資源有 效管理功能。
3.1 體系描述
在JDBC規范中,應用通過驅動接口(Driver Interface)直接方法數據庫的資源。為了有效、合理地管理資源,在應用與JDBC Driver之間,增加了連接池: Snap-ConnectionPool。并且通過面向對象的機制,使連接池的大部分操作是透明的。參見下圖,Snap-ConnectionPool的 體系:

圖中所示,通過實現JDBC的部分資源對象接口( Connection, Statement, ResultSet ),在 Snap-ConnectionPool內部分別產生三種邏輯資源對象: PooledConnection, PooledStatement和 PooledResultSet。它們也是連接池主要的管理操作對象,并且繼承了JDBC中相應的從屬關系。這樣的體系有以下幾個特點:
— 透明性。在不改變應用原有的使用JDBC驅動接口的前提下,提供資源管理的服務。應用系統,如同原有的 JDBC,使用連接池提供的邏輯對象資源。簡化了應用程序的連接池改造。
— 資源封裝。復雜的資源管理被封裝在? Snap-ConnectionPool內部,不需要應用系統過多的干涉。管理操作的可靠性、安全性由連接池保證。應用的干涉(如:主動關閉資源),只起 到優化系統性能的作用,遺漏操作不會帶來負面影響。
— 資源合理應用。按照JDBC中資源的從屬關系,Snap-ConnectionPool不僅對Connection進行緩沖處理,對Statement也 有相應的機制處理。在2.3已描述,合理運用Connection和Statement之間的關系,可以更大限度地使用資源。所以,Snap- ConnectionPool封裝了Connection資源,通過內部管理PooledConnection,為應用系統提供更多的Statement 資源。
— 資源連鎖管理。Snap-ConnectionPool包含的三種邏輯對象,繼承了JDBC中相應對象之間的從屬關系。在內部管理中,也依照從屬關系進行 連鎖管理。例如:判斷一個Connection是否超時,需要根據所包含的Statement是否活躍;判斷Statement也要根據 ResultSet的活躍程度。

3.2 連接池集中管理ConnectionManager
ConnectionPool是Snap- ConnectionPool的連接池對象。在Snap-ConnectionPool內部,可以指定多個不同的連接池(ConnectionPool) 為應用服務。ConnectionManager管理所有的連接池,每個連接池以不同的名稱區別。通過配置文件適應不同的數據庫種類。如下圖所示:

  通過ConnectionManager,可以同時管理多個不同的連接池,提供通一的管理界面。在應用系統中通過 ConnectionManager和相關的配置文件,可以將凌亂散落在各自應用程序中的數據庫配置信息(包括:數據庫名、用戶、密碼等信息),集中在一 個文件中。便于系統的維護工作。

  3.3 連接池使用范例

  對2.1的標準JDBC的使用范例,改為使用連接池,結果如下:

import java.sql.*;
import net.snapbug.util.dbtool.*;

..ConnectionPool dbConn = ConnectionManager
.getConnectionPool("testOracle" );
Statement st = dbConn.createStatement();
ResultSet rs = st.executeQuery(
“select * from demo_table” );

some data source operation
in herers.close();st.close();

  在例子中,Snap-ConnectionPool封裝了應用對Connection的管理。只要改變JDBC獲取Connection的方 法,為獲取連接池(ConnectionPool)(粗體部分),其他的數據操作都可以不做修改。按照這樣的方式,Snap- ConnectionPool可幫助應用有效地管理數據庫資源。如果應用忽視了最后資源的釋放: rs.close() 和 st.close(),連接池會通過超時(time-out)機制,自動回收。

4.小結

  無論是Snap-ConnectionPool還是其他的數據庫連接池,都應當具備一下基本功能:

  -對源數據庫資源的保護

  -充分利用發揮數據庫的有效資源

  -簡化應用的數據庫接口,封閉資源管理。

  -對應用遺留資源的自動回收和整理,提高資源的再次利用率。

  在這個前提下,應用程序才能投入更多的精力于各自的業務邏輯中。數據庫資源也不再成為系統的瓶頸。

JDBC數據庫連接池 Statment


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品视频一区牛牛视频 | 精品久久久久久久九九九精品 | 99久久中文字幕伊人情人 | 在线亚洲国产精品区 | 国产精品久久久久久一区二区 | 国产精品入口麻豆午夜 | 最刺激黄a大片免费观看下截 | 日韩成人高清 | 亚洲精品视频免费 | 99re6这里只有精品视频 | 精品一区二区三区在线观看l | 国产精品爱久久久 | 3d动漫精品成人一区二区三 | 网站一级片 | 国产一起色一起爱 | 国产福利影院 | 999成人精品视频在线 | 免费国产高清精品一区在线 | 精品中文字幕乱码一区二区 | 在线免费观看一级毛片 | 性一级录像 | 久久久久久久综合狠狠综合 | 豆国产97在线 | 亚洲 | 国产欧美在线观看不卡 | 手机精品在线 | 欧美jizzhd精品欧美另类 | 欧美日本一本 | 午夜香蕉 | 亚洲美女视频网站 | 国产日韩欧美在线 | 播放一级录像片 | 欧美人与鲁交大毛片免费 | 亚洲精品一区二区久久这里 | 久久国产免费福利永久 | 青青热久久国产久精品 | 成人亚洲国产精品久久 | 日韩男女视频 | 久久riav.com| 少妇美女极品美軳人人体 | 91在线成人| 久草在线国产 |