J2EE社區

          茍有恒,何必三更起五更眠;
          最無益,只怕一日曝十日寒.
          posts - 241, comments - 318, trackbacks - 0, articles - 16

          java 連接池 總結 復習

          Posted on 2009-08-24 15:23 xcp 閱讀(2725) 評論(5)  編輯  收藏 所屬分類: JAVA

           

          最近幾天無聊啊,所以就來看看Java基礎,雖然學習java有一段時間了,但是對Java連接池一直很陌生,就對照相關資料,自己寫了一個,希望高手指教!!

          本例子只有三個文件,下面是其源碼

          resourceBundle.properties文件

          connection.username=sa

          connection.password=sa

          connection.url=jdbc:sqlserver://localhost:1433;databaseName=collectionpool connection.driverClass=com.microsoft.jdbc.sqlserver.SQLServerDriver

          connection.poolSize=20

          ResourceManager.java文件

          package org.topCSA.connection.db.Resource;

          import java.util.ResourceBundle;

          publicclass ResourceManager {

              privatestatic ResourceBundle r;

              static{

                 r = ResourceBundle.getBundle("resourceBundle");

              }

              publicstatic String getDriverClass(){

                 returnr.getString("connection.driverClass");

              }

              publicstatic String getUrl(){

                 returnr.getString("connection.url");

              }

              publicstatic String getUsername(){

                 returnr.getString("connection.username");

              }

              publicstatic String getPassword(){

                 returnr.getString("connection.password");

              }

              publicstaticintgetPoolSize(){

                 int poolSize = Integer.valueOf(r.getString("connection.poolSize"));

                 return poolSize;

              }

              publicstaticvoid refresh(){

                 r = ResourceBundle.getBundle("resourceBundle");

              }

          }

          DbConnectionPool.java

          package org.topCSA.connection.db;

          import java.sql.Connection;

          import java.sql.DriverManager;

          import java.sql.SQLException;

          import java.util.ArrayList;

          import java.util.List;

          import org.topCSA.connection.db.Resource.ResourceManager;

          publicclass DbConnectionPool {

              private List<Connection> pool;

              privateintpoolSize = 1;

              private Connection conn = null;

              privatestatic DbConnectionPool instance = null;

              /**

               *單粒模式私有構造方法,獲得本類的對象,通過getIstance方法。

               */

              private DbConnectionPool() {

                 pool = new ArrayList<Connection>();

                 this.createConnection();

              }

              /**

               *得到當前連接池的一個實例

               */

              publicstatic DbConnectionPool getInstance() {

                 if (instance == null) {

                     instance = new DbConnectionPool();

                 }

                 returninstance;

              }

              /**

               *得到連接池中的一個連接

               */

              publicsynchronized Connection getConnection() {

                 if (pool.size() > 0) {

                     Connection conn = pool.get(0);

                     pool.remove(conn);

                     return conn;

                 } else {

                     returnnull;

                 }

              }

              /**

               *創建初始的數據庫連接

               */

              privatevoid createConnection() {

                 int temp = ResourceManager.getPoolSize();

                 if(temp > 0){

                     this.poolSize = temp;

                 }

                 for (int i = 0; i < poolSize; i++) {

                     try {

                        Class.forName(ResourceManager.getDriverClass());

                        conn = DriverManager.getConnection(ResourceManager.getUrl(),ResourceManager.getUsername(),ResourceManager.getPassword());

                        pool.add(conn);

                     } catch (ClassNotFoundException e) {

                        e.printStackTrace();

                     } catch (SQLException e) {

                        e.printStackTrace();

                     }

                 }

              }

              /**

               *用完將連接放回到連接池中

               *

               *@paramconn

               */

              publicsynchronizedvoid release(Connection conn) {

                 pool.add(conn);

              }

             

              /**

               *關閉連接池中的所有連接

               */

              publicsynchronizedvoid closePool() {

                 for (int i = 0; i < pool.size(); i++) {

                     try {

                        conn = ((Connection) pool.get(i));

                        conn.close();

                        pool.remove(i);

                     } catch (SQLException e) {

                        e.printStackTrace();

                     }

                 }

              }

          }








          接下來在說一下,現在主流的java開源的連接池:
          1.C3P0  :是一個開放源代碼的JDBC連接池,它在lib目錄中與Hibernate一起發布,包括了實現jdbc3和jdbc2擴展規范說明的Connection 和Statement 池的DataSources 對象。參考網站: http://sourceforge.net/projects/c30/
          2.Proxool :是一個Java SQL Driver驅動程序,提供了對你選擇的其它類型的驅動程序的連接池封裝。可以非常簡單的移植到現存的代碼中。完全可配置。快速,成熟,健壯。可以透明地為你現存的JDBC驅動程序增加連接池功能。  參考網站: http://proxool.sourceforge.net
          3.Jakarta DBCP  :是一個依賴Jakarta commons-pool對象池機制的數據庫連接池.DBCP可以直接的在應用程序用使用。參考網站: http://jakarta.apache.org/commons/dbcp/
          4.ctionBroker  :DBCP是一個依賴Jakarta commons-pool對象池機制的數據庫連接池.DBCP可以直接的在應用程序用使用。參考網站:http://jakarta.apache.org/commons/dbcp/
          5.DBPool  :是一個高效的易配置的數據庫連接池。它除了支持連接池應有的功能之外,還包括了一個對象池使你能夠開發一個滿足自已需求的數據庫連接池。參考網站:http://homepages.nildram.co.uk/~slink/java/DBPool/
          6.XAPool :是一個高效的易配置的數據庫連接池。它除了支持連接池應有的功能之外,還包括了一個對象池使你能夠開發一個滿足自已需求的數據庫連接池。參考網站:http://xapool.experlog.com/
          7.SmartPool  :SmartPool是一個連接池組件,它模仿應用服務器對象池的特性。SmartPool能夠解決一些臨界問題如連接泄漏(connection leaks),連接阻塞,打開的JDBC對象如Statements,PreparedStatements等. SmartPool的特性包括支持多個pools,自動關閉相關聯的JDBC對象, 在所設定time-outs之后察覺連接泄漏,追蹤連接使用情況, 強制啟用最近最少用到的連接,把SmartPool"包裝"成現存的一個pool等。參考網站:http://smartpool.sourceforge.net/
          8.MiniConnectionPoolManager  :MiniConnectionPoolManager是一個輕量級JDBC數據庫連接池。它只需要Java1.5(或更高)并且沒有依賴第三方包。參考網站:http://www.source-code.biz/snippets/java/8.htm


          名稱: ?4C.ESL | .↗Evon
          口號: 遇到新問題?先要尋找一個方案乄而不是創造一個方案こ
          mail: 聯系我


          Feedback

          # re: java 連接池 總結 復習  回復  更多評論   

          2009-08-24 17:12 by 凡客誠品
          很好啊

          # re: java 連接池 總結 復習  回復  更多評論   

          2009-08-25 09:15 by 找個美女做老婆
          Java樂園學習網站: http://www.javaly.cn

          有大量的學習文章和視頻教程,以及一些項目源碼

          Java樂園學習群: 81107233

          # re: java 連接池 總結 復習[未登錄]  回復  更多評論   

          2009-08-26 23:06 by 菜菜寶寶
          我認為不好!看看開源的連接池在使用時跟 JDBC 沒有什么區別,采用 con.close() 將連接歸還到池中去,而不是用了連接池我們必須用 release(con) 來歸還連接。
          我們要做到使用和不使用這樣東西,對代碼來說可以一行不用更改,唯一不同的只是獲得連的方式不同,其他的還是完全一樣,這樣的東西才有價值。
          重寫 con.close 的方法一般裝飾器模式重新包裝,或者更為方便地采用動態代理進行攔截之后修改方法的行為。

          # re: java 連接池 總結 復習[未登錄]  回復  更多評論   

          2009-08-26 23:10 by 菜菜寶寶
          上面說的只是設計連接池中碰到的問題之一,還能很多復雜的問題,諸如:

          如果連接的物理連接斷開連接池該采取哪些措施?
          如果連接池中的連接狀態已經超時了該采取什么處理?
          如果連接池中的連接耗盡是讓用戶一直等呢,還是拋出獲取連接超時?

          等等諸如此類的問題。要想設計一個在現實當中能使用的連接池并非易事!

          # re: java 連接池 總結 復習[未登錄]  回復  更多評論   

          2009-08-27 13:52 by xcp
          @菜菜寶寶
          首先,在這謝謝菜菜寶寶指出,上面幾點真的還需要認真的考慮,特別是連接狀態已經超時,接池中的連接耗盡是讓用戶一直等呢,還是拋出獲取連接超時?等問題。。。。希望我自己有時間看看其它主流的java開源的連接池,看它們是怎么實現的。。。在次謝謝!!!
          主站蜘蛛池模板: 锡林郭勒盟| 南丹县| 侯马市| 巴青县| 德安县| 虞城县| 兖州市| 福海县| 嘉荫县| 怀宁县| 静海县| 安塞县| 孟州市| 淮北市| 镇原县| 肇庆市| 锡林郭勒盟| 泸定县| 赣州市| 读书| 阳山县| 马鞍山市| 柞水县| 邹平县| 永善县| 壶关县| 南通市| 唐河县| 武隆县| 噶尔县| 天津市| 无极县| 汉沽区| 玛纳斯县| 隆化县| 辽阳县| 大城县| 台南县| 岗巴县| 新余市| 正定县|