JDBC3.0研究報告(節選)

來源:互聯網
上載者:User

(by huihoo.org Quaker Tan)

資料庫連接池的基本原理
傳統的資料庫連接方式(指通過DriverManager和基本實現DataSource進行串連)中,一個資料庫連接對象均對應一個物理資料庫連接,資料庫連接的建立以及關閉對系統而言是耗費系統資源的操作,在多層結構的應用程式環境中這種耗費資源的動作對系統的效能影響尤為明顯。

在多層結構的應用程式中通過串連池(connection pooling)技術可以使系統的效能明顯得到提到,串連池意味著當應用程式需要調用一個資料庫連接的時,資料庫相關的介面通過返回一個通過重用資料庫連接來代替重新建立一個資料庫連接。通過這種方式,應用程式可以減少對資料庫連接操作,尤其在多層環境中多個用戶端可以通過共用少量的物理資料庫連接來滿足系統需求。通過串連池技術Java應用程式不僅可以提高系統效能同時也為系統提高了可測量性。

資料庫連接池是運行在背景而且應用程式的編碼沒有任何的影響。此中狀況存在的前提是應用程式必須通過DataSource對象(一個實現javax.sql.DataSource介面的執行個體)的方式代替原有通過DriverManager類來獲得資料庫連接的方式。一個實現javax.sql.DataSource介面的類可以支援也可以不支援資料庫連接池,但是兩者獲得資料庫連接的代碼基本是相同的。

代碼如下:

一個DataSource對象通常註冊在JNDI命名服務上,應用程式可以通過標準的方式獲得到註冊在JNDI服務上的DataSource對象。

Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("jdbc/openbase");

如果當前DataSource不支援資料庫連接池,應用程式將獲得一個和物理資料庫連接對應的Connection對象。而如果當前的DataSource對象支援資料庫連接池,應用程式自動獲得重用的資料庫連接而不用建立新的資料庫連接。重用的資料庫連接和建立立串連的資料庫連接使用上沒有任何不同。應用程式可以通過重用的串連正常的訪問資料庫,進行訪問資料的操作,完成操作後應顯式的調用close()關閉資料庫連接。

Connection con = ds.getConnection("User", "Pwd");
相關資料庫的操作;
con.close();

當關閉資料連線後,當前使用的資料庫連接將不會被物理關閉,而是放回到資料庫連接池中進行重用。

JDBC3.0規範中資料庫連接池架構
JDBC3.0規範中通過提供了一個支援資料庫連接池的架構,這個架構僅僅規定了如何支援串連池的實現,而串連池的具體實現JDBC 3.0規範並沒有做相關的規定。通過這個架構可以讓不同角色的開發人員共同實現資料庫連接池。

通過JDBC3.0規範可以知道具體資料庫連接池的實現可以分為JDBC Driver級和Application Server級。在JDBC Driver級的實現中任何相關的工作均由特定資料庫廠商的JDBC Drvier的開發人員來具體實現,即JDBC Driver既需要提供對資料庫連接池的支援同時也必須對資料庫連接池進行具體實現。而在Application Server級中資料庫連接池的實現中特定資料庫廠商的JDBC Driver開發人員和Application Server開發人員來共同實現資料庫連接池的實現(但是現在大多數Application Server廠商實現的串連池的機制和規範中提到有差異),其中特定資料庫廠商的JDBC Driver提供資料庫連接池的支援而特定的Application Server廠商提供資料庫連接池的具體實現。

JDBC3.0規範規定了如下的類和介面來支援資料庫連接池的實現。

javax.sql.ConnectionEvent
javax.sql.ConnectionPoolDataSource
javax.sql.PooledConnection
javax.sql.ConnectionEventListener

其中除javax.sql.ConnectionEvent是類,其它的均為介面。

C:/1.jpg


JDBC3.0串連池架構的關係圖

通過此圖可以大概的瞭解相關介面在一個典型的三層環境中應用程式的位置。

資料庫連接池實現層次中,由特定資料庫廠商的JDBC Driver開發人員提供串連池支援,而特定Application Server提供串連池實現的情況比較複雜,其它的實現層次均可視為其簡化情況的一種。下面將針對這種情況進行說明。

在這個架構主要有兩個使用者角色存在,它們分別是:

特定資料庫廠商的JDBC Driver開發人員,之後將簡稱為Driver Vendor
特定Application Server中串連池開發人員,之後將簡稱為Pooling Vendor

C:/2.bmp


JDBC3.0規範中在上述情況下各個介面和類之間的UML圖

下面對幾個關鍵模組進行詳細的說明:

Driver Vendor DataSource:
Driver Vendor必須提供一個ConnectionPoolDataSource 介面的具體實現,通過這個介面Pooling Vendor可以得到一個PooledConnection對象,從而使第三方實現的串連池可以使用特定資料庫廠商得到JDBC Driver產生的資料庫連接。在這裡ConnectionPoolDataSource介面扮演的角色可以視為產生PooledConnection 對象的工廠。

Driver Vendor PooledConnection:
Driver Vendor必須提供標準PooledConnection 介面實現的類,這個介面允許Pooling Vendor在JDBC Driver提供串連池支援的基礎上實現串連池。一個具體PooledConnection對象代表了一個物理的資料庫連接;由PooledConnection對象建立Connection對象僅僅只是一個指向PooledConnetion對象的控制代碼。在JDBC 3.0串連池實現架構中PooledConnection對象扮演的角色可以視為產生Connection對象的工廠。

Pooling Vendor DataSource:
Pooling Vendor必須實現DataSource介面,這個介面是和串連池實現模組進行互動的進入點。ConnectionPoolDataSource根據需要建立PooledConnection對象。

Pooling Vendor Connection Cache:
此模組是Pooling Vendor對串連池的具體實現。JDBC 3.0 規範沒有規定在DataSource對象和資料庫連接池實現之間的需要實現的介面,所以它們之間的互動由Pooling Vendor自己定義。一般而言,一個資料庫連接池的具體實現包含了一個或若干個具體的類,但是在串連池實現模組中必須包含一個類實現標準ConnectionEventListener介面。當一個PooledConnectiond對象被關閉或者出現異常的時候,PooledConnection對象將會向ConnectionEventListener介面發送ConnectionEvent對象,串連池實現模組將會根據返回的ConnectionEvent對象對PooledConnection進行關閉或者重用操作。

ConnectionEvent:
實現串連池時,當應用程式調用Connection.close()試圖去關閉資料庫連接時,這時需要有一個通告給串連池實現模組,通告對當前的資料庫物理串連(PooledConnection 對象)進行重用。為了使串連池實現模組能得到這種"通告",串連池實現模組必須實現ConnectionEventListener介面,而且同時需要註冊成為PooledConnection對象的監聽者。串連池實現模組通過PooledConnection.addConnectionEventListener()方法註冊自己成為一個監聽者。

在典型三層環境中具體調用流程:
當應用程式通過調用DataSource.getConnection()得到一個資料庫連接。

Pooling Vendor實現的DataSource對象在串連池中進行尋找看當前是否有有效PooledConnection對象,如果串連池中有可用的PooledConnection,則進行檢查,如果當前的PooledConnection可用則使用。

如果如果串連池中沒有可用的PooledConnection對象,或者當前的PooledConnection對象不正確,那麼Pooling Vendor調用ConnectionPoolDataSource.getPooledConnection類建立一個新的PooledConnection對象,這時由Driver Vendor實現的ConnectionPoolDataSource將會建立一個滿足要求新的PooledConnection對象,並將其返回給串連池實現模組進行管理。

然後,Pooling Vendor會調用PooledConnection.getConnection()獲得一個邏輯的Connection對象,這個邏輯的Connection對象將會象正常的Connection對象返回給應用程式。這個邏輯Connection對象實際上是串連池中PooledConnection對象的一個控制代碼,當串連池有效時,應用程式調用DataSource.getConnection()就會得到這個控制代碼。簡而言之,應用程式此時使用的Connection對象僅僅是其建立者PooledConnection對象的控制代碼而已。

串連池實現模組調用PooledConnection.addConnectionEventListener()將自己註冊成為一個PooledConnection對象的監聽者,當資料庫連接需要重用或者關閉的時候串連池實現模組可以得到通告。

當應用程式通過調用Connection.close()來關閉資料庫連接,這時一個ConnectionEvent對象被建立並被返回到串連池實現模組,串連池實現模組接受到此通告後,將PooledConnection對象返回到池中進行重用。這些過程中其它角色都不能訪問PooledConnection.close()方法,能訪問這個方法的只有Pooling Vendor,它們使用這個方法對串連池中的對象進行操作,通過PooledConnection.close()方法可以關閉物理資料庫連接。

整理髮布:admin

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.