溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何分析一種簡單JDBC連接池的實現(xiàn)

發(fā)布時間:2021-11-24 13:42:51 來源:億速云 閱讀:91 作者:柒染 欄目:編程語言

如何分析一種簡單JDBC連接池的實現(xiàn),針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。JDBC連接池。

1.前言

數(shù)據(jù)庫應用,在許多軟件系統(tǒng)中經(jīng)常用到,是開發(fā)中大型系統(tǒng)不可缺少的輔助。但如果對數(shù)據(jù)庫資源沒有很好地管理(如:沒有及時回收數(shù)據(jù)庫的游標(ResultSet)、Statement、連接 (Connection)等資源),往往會直接導致系統(tǒng)的穩(wěn)定。這類不穩(wěn)定因素,不單單由數(shù)據(jù)庫或者系統(tǒng)本身一方引起,只有系統(tǒng)正式使用后,隨著流量、用戶的增加,才會逐步顯露。

在b基于Java開發(fā)的系統(tǒng)中,JDBC是程序員和數(shù)據(jù)庫打交道的主要途徑,提供了完備的數(shù)據(jù)庫操作方法接口。但考慮到規(guī)范的適用性,JDBC只提供了最直接的數(shù)據(jù)庫操作規(guī)范,對數(shù)據(jù)庫資源管理,如:對物理連接的管理及緩沖,期望第三方應用服務器(Application Server)的提供。

以JDBC規(guī)范為基礎,介紹相關的數(shù)據(jù)庫連接池機制,并就如果以簡單的方式,實現(xiàn)有效地管理數(shù)據(jù)庫資源介紹相關實現(xiàn)技術。

2.連接池技術背景

2.1JDBC

JDBC是一個規(guī)范,遵循JDBC接口規(guī)范,各個數(shù)據(jù)庫廠家各自實現(xiàn)自己的驅(qū)動程序(Driver),如下圖所示:

應用在獲取數(shù)據(jù)庫連接時,需要以URL的方式指定是那種類型的Driver,在獲得特定的連接后,可按照固定的接口操作不同類型的數(shù)據(jù)庫,如: 分別獲取Statement、執(zhí)行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 herers.close();  st.close();dbConn.close();

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

2.2JDBC連接池

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

JDBC最常用的資源有三類:

  • Connection: 數(shù)據(jù)庫連接。

  • Statement: 會話聲明。

  • ResultSet: 結果集游標。

分別存在以下的關系 :

這是一種 ‘爺-父-子’ 的關系,對Connection的管理,就是對數(shù)據(jù)庫資源的管理。舉個例子: 如果想確定某個數(shù)據(jù)庫連接(Connection)是否超時,則需要確定其(所有的)子Statement是否超時,同樣,需要確定所有相關的ResultSet是否超時;在關閉Connection前,需要關閉所有相關的Statement和ResultSet。

因此,連接池(Connection Pool)所起到的作用,不僅僅簡單地管理Connection,還涉及到 Statement和ResultSet。

2.3連接池(ConnectionPool)與資源管理

ConnectionPool以緩沖池的機制,在一定數(shù)量上限范圍內(nèi),控制管理Connection,Statement和ResultSet。任何數(shù)據(jù)庫的資源是有限的,如果被耗盡,則無法獲得更多的數(shù)據(jù)服務。

在大多數(shù)情況下,資源的耗盡不是由于應用的正常負載過高,而是程序原因。

在實際工作中,數(shù)據(jù)資源往往是瓶頸資源,不同的應用都會訪問同一數(shù)據(jù)源。其中某個應用耗盡了數(shù)據(jù)庫資源后,意味其他的應用也無法正常運行。因此,ConnectionPool的***個任務是限制:每個應用或系統(tǒng)可以擁有的***資源。也就是確定連接池的大小(PoolSize)。

ConnectionPool的第二個任務:在連接池的大小(PoolSize)范圍內(nèi),***限度地使用資源,縮短數(shù)據(jù)庫訪問的使用周期。許多數(shù)據(jù)庫中,連接(Connection)并不是資源的最小單元,控制Statement資源比Connection更重要。以Oracle為例:

每申請一個連接(Connection)會在物理網(wǎng)絡(如 TCP/IP網(wǎng)絡)上建立一個用于通訊的連接,在此連接上還可以申請一定數(shù)量的Statement。同一連接可提供的活躍Statement數(shù)量可以達到幾百。 在節(jié)約網(wǎng)絡資源的同時,縮短了每次會話周期(物理連接的建立是個費時的操作)。但在一般的應用中,多數(shù)按照2.1范例操作,這樣有10個程序調(diào)用,則會產(chǎn)生10次物理連接,每個Statement單獨占用一個物理連接,這是極大的資源浪費。 ConnectionPool可以解決這個問題,讓幾十、幾百個Statement只占用同一個物理連接, 發(fā)揮數(shù)據(jù)庫原有的優(yōu)點。

通過ConnectionPool對資源的有效管理,應用可以獲得的Statement總數(shù)到達 :

(并發(fā)物理連接數(shù)) x (每個連接可提供的Statement數(shù)量)

例如某種數(shù)據(jù)庫可同時建立的物理連接數(shù)為 200個,每個連接可同時提供250個Statement,那么ConnectionPool最終為應用提供的并發(fā)Statement總數(shù)為: 200 x 250 = 50,000個。這是個并發(fā)數(shù)字,很少有系統(tǒng)會突破這個量級。所以在本節(jié)的開始,指出資源的耗盡與應用程序直接管理有關。

對資源的優(yōu)化管理,很大程度上依靠數(shù)據(jù)庫自身的JDBC Driver是否具備。有些數(shù)據(jù)庫的JDBC Driver并不支持Connection與Statement之間的邏輯連接功能,如SQLServer,我們只能等待她自身的更新版本了。

對資源的申請、釋放、回收、共享和同步,這些管理是復雜精密的。所以,ConnectionPool另一個功能就是,封裝這些操作,為應用提供簡單的,甚至是不改變應用風格的調(diào)用接口。

3.簡單JDBC連接池的實現(xiàn)

根據(jù)第二章中原理機制,Snap-ConnectionPool(一種簡單快速的連接池工具)按照部分的JDBC規(guī)范,實現(xiàn)了連接池所具備的對數(shù)據(jù)庫資源有效管理功能。

3.1體系描述

在JDBC規(guī)范中,應用通過驅(qū)動接口(Driver Interface)直接方法數(shù)據(jù)庫的資源。為了有效、合理地管理資源,在應用與JDBC Driver之間,增加了連接池: Snap-ConnectionPool。并且通過面向?qū)ο蟮臋C制,使連接池的大部分操作是透明的。

通過實現(xiàn)JDBC的部分資源對象接口( Connection, Statement, ResultSet ),在 Snap-ConnectionPool內(nèi)部分別產(chǎn)生三種邏輯資源對象: PooledConnection, PooledStatement和 PooledResultSet。它們也是連接池主要的管理操作對象,并且繼承了JDBC中相應的從屬關系。這樣的體系有以下幾個特點:

(1)透明性。

在不改變應用原有的使用JDBC驅(qū)動接口的前提下,提供資源管理的服務。應用系統(tǒng),如同原有的 JDBC,使用連接池提供的邏輯對象資源。簡化了應用程序的連接池改造。

(2)資源封裝。

復雜的資源管理被封裝在 Snap-ConnectionPool內(nèi)部,不需要應用系統(tǒng)過多的干涉。管理操作的可靠性、安全性由連接池保證。應用的干涉(如:主動關閉資源),只起到優(yōu)化系統(tǒng)性能的作用,遺漏操作不會帶來負面影響。

(3)資源合理應用。

按照JDBC中資源的從屬關系,Snap-ConnectionPool不僅對Connection進行緩沖處理,對Statement也有相應的機制處理。在2.3已描述,合理運用Connection和Statement之間的關系,可以更大限度地使用資源。所以,Snap-ConnectionPool封裝了Connection資源,通過內(nèi)部管理PooledConnection,為應用系統(tǒng)提供更多的Statement資源。

(4)資源連鎖管理。

Snap-ConnectionPool包含的三種邏輯對象,繼承了JDBC中相應對象之間的從屬關系。在內(nèi)部管理中,也依照從屬關系進行連鎖管理。例如:判斷一個Connection是否超時,需要根據(jù)所包含的Statement是否活躍;判斷Statement也要根據(jù)ResultSet的活躍程度。

3.2連接池集中管理ConnectionManager

ConnectionPool是Snap-ConnectionPool的連接池對象。在Snap-ConnectionPool內(nèi)部,可以指定多個不同的連接池(ConnectionPool)為應用服務。ConnectionManager管理所有的連接池,每個連接池以不同的名稱區(qū)別。通過配置文件適應不同的數(shù)據(jù)庫種類。

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

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)(粗體部分),其他的數(shù)據(jù)操作都可以不做修改。按照這樣的方式,Snap-ConnectionPool可幫助應用有效地管理數(shù)據(jù)庫資源。如果應用忽視了資源的釋放: rs.close() 和 st.close(),連接池會通過超時(time-out)機制,自動回收。

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

  • 對源數(shù)據(jù)庫資源的保護

  • 充分利用發(fā)揮數(shù)據(jù)庫的有效資源

  • 簡化應用的數(shù)據(jù)庫接口,封閉資源管理。

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

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

關于如何分析一種簡單JDBC連接池的實現(xiàn)問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業(yè)資訊頻道了解更多相關知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI