Snap ConnectionPool簡介(圖)- -

Snap ConnectionPool簡介(圖)- -

                                      

 

【虎.無名】Jdbc連接池接口有兩種,目前的主流連接池,都是基於DataSource接口的。而下面這個,則直接基於原始Conntion和Statement等。Snap ConnectionPool的特點是,不僅僅緩存Connection,還對Statement和ResultSet等做了足夠的緩存,通過超時回收來確保可靠資源釋放。

產品 http://www.snapbug.net/product/snappool/product_sp_01.htm

簡介 | 下載 | FAQ
 
簡介

  數據庫應用,在許多軟件系統中,都經常用到,是開發中大型系統不可缺少的輔助。但如果對數據庫資源的沒有很好管理(如:沒有及時回收數據庫的遊標(ResultSet)、Statement、連接 (Connection)等資源),會直接導致系統的穩定性能。這類不穩定因素,不單單由數據庫或者系統本身一方引起,所以在開發期、以及測試期很難發現這。只有在系統正式使用後,隨着流量、用戶的增加,纔會逐步顯露。

  爲了簡化數據庫開發,缺省有效地管理數據庫資源,Snap-ConnectionPool以最簡單的方式,爲應用供以一個有效的數據庫資源管理工具。

 

體系結構

  在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也有相應的機制處理。合理運用Connection和Statement之間的關係,可以更大限度地使用資源。所以,Snap-ConnectionPool封裝了Connection資源,通過內部管理PooledConnection,爲應用系統提供更多的Statement資源。

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

 

 

工作機制

  Snap-ConnectionPool以緩衝池的機制,在一定數量上限範圍內,控制管理Connection,Statement和ResultSet。任何數據庫的資源是有限的,如果被耗盡,則無法獲得更多的數據服務。在大多數情況下,資源的耗盡不是由於應用的正常負載過高,而是程序原因。在實際工作中,數據資源往往是瓶頸資源,不同的應用都會訪問同一數據源。其中某個應用耗盡了數據庫資源後,意味其他的應用也無法正常運行。因此,Snap-ConnectionPool的第一個任務是限制:每個應用或系統可以擁有的最大資源。也就是確定連接池的大小(PoolSize)。

  ConnectionPool的第二個任務:在連接池的大小(PoolSize)範圍內,最大限度地使用資源,縮短數據庫訪問的使用週期。許多數據庫中,連接(Connection)並不是資源的最小單元,控制Statement資源比Connection更重要。以Oracle爲例:

  • 每申請一個連接(Connection)會在物理網絡(如 TCP/IP網絡)上建立一個用於通訊的連接,在此連接上還可以申請一定數量的Statement。
  • 同一連接可提供的活躍Statement數量可以達到幾百。 在節約網絡資源的同時,縮短了每次會話週期(物理連接的建立是個費時的操作)。
  • 但在一般的應用中,多數按照下面範例操作,這樣有10個程序調用,則會產生10次物理連接,每個Statement單獨佔用一個物理連接,這是極大的資源浪費。
  • Snap-ConnectionPool可以解決這個問題,讓幾十、幾百個Statement只佔用同一個物理連接, 發揮數據庫原有的優點。

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

 

應用範例

  沒有使用連接池的,常規的JDBC範例:


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();


  使用Snap-ConnectionPool連接池範例:


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 here

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


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

 

- 作者: nike_liu 2006年05月25日, 星期四 10:28

發佈了11 篇原創文章 · 獲贊 1 · 訪問量 3958
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章