<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    J2EE社區(qū)

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

    java 連接池 總結(jié) 復(fù)習(xí)

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

     

    最近幾天無聊啊,所以就來看看Java基礎(chǔ),雖然學(xué)習(xí)java有一段時(shí)間了,但是對(duì)Java連接池一直很陌生,就對(duì)照相關(guān)資料,自己寫了一個(gè),希望高手指教!!

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

    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;

        /**

         *單粒模式私有構(gòu)造方法,獲得本類的對(duì)象,通過getIstance方法。

         */

        private DbConnectionPool() {

           pool = new ArrayList<Connection>();

           this.createConnection();

        }

        /**

         *得到當(dāng)前連接池的一個(gè)實(shí)例

         */

        publicstatic DbConnectionPool getInstance() {

           if (instance == null) {

               instance = new DbConnectionPool();

           }

           returninstance;

        }

        /**

         *得到連接池中的一個(gè)連接

         */

        publicsynchronized Connection getConnection() {

           if (pool.size() > 0) {

               Connection conn = pool.get(0);

               pool.remove(conn);

               return conn;

           } else {

               returnnull;

           }

        }

        /**

         *創(chuàng)建初始的數(shù)據(jù)庫連接

         */

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

        }

       

        /**

         *關(guān)閉連接池中的所有連接

         */

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

               }

           }

        }

    }








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


    名稱: ?4C.ESL | .↗Evon
    口號(hào): 遇到新問題?先要尋找一個(gè)方案乄而不是創(chuàng)造一個(gè)方案こ
    mail: 聯(lián)系我


    Feedback

    # re: java 連接池 總結(jié) 復(fù)習(xí)  回復(fù)  更多評(píng)論   

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

    # re: java 連接池 總結(jié) 復(fù)習(xí)  回復(fù)  更多評(píng)論   

    2009-08-25 09:15 by 找個(gè)美女做老婆
    Java樂園學(xué)習(xí)網(wǎng)站: http://www.javaly.cn

    有大量的學(xué)習(xí)文章和視頻教程,以及一些項(xiàng)目源碼

    Java樂園學(xué)習(xí)群: 81107233

    # re: java 連接池 總結(jié) 復(fù)習(xí)[未登錄]  回復(fù)  更多評(píng)論   

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

    # re: java 連接池 總結(jié) 復(fù)習(xí)[未登錄]  回復(fù)  更多評(píng)論   

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

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

    等等諸如此類的問題。要想設(shè)計(jì)一個(gè)在現(xiàn)實(shí)當(dāng)中能使用的連接池并非易事!

    # re: java 連接池 總結(jié) 復(fù)習(xí)[未登錄]  回復(fù)  更多評(píng)論   

    2009-08-27 13:52 by xcp
    @菜菜寶寶
    首先,在這謝謝菜菜寶寶指出,上面幾點(diǎn)真的還需要認(rèn)真的考慮,特別是連接狀態(tài)已經(jīng)超時(shí),接池中的連接耗盡是讓用戶一直等呢,還是拋出獲取連接超時(shí)?等問題。。。。希望我自己有時(shí)間看看其它主流的java開源的連接池,看它們是怎么實(shí)現(xiàn)的。。。在次謝謝!!!
    主站蜘蛛池模板: 亚洲精品无码日韩国产不卡av| 国产精品永久免费10000| 亚洲无mate20pro麻豆| 亚洲人成人77777网站| 国产免费av片在线无码免费看| 黄色免费网站网址| 免费在线看黄的网站| 久香草视频在线观看免费| 精品国产_亚洲人成在线| 最新国产成人亚洲精品影院| 久久久久亚洲AV无码永不| 亚洲精品无码久久一线| 亚洲中文字幕无码爆乳av中文| 黄网址在线永久免费观看 | 最近免费中文字幕大全视频| 七色永久性tv网站免费看| 久久久受www免费人成| jizz免费一区二区三区| 黄色a三级免费看| 无码天堂va亚洲va在线va| 亚洲AV无码专区在线电影成人| 亚洲毛片基地4455ww| 亚洲国产品综合人成综合网站| 亚洲天堂男人天堂| 久久青青草原亚洲av无码app| 亚洲av无码乱码国产精品fc2| 亚洲精品无码专区在线在线播放| 亚洲人成网77777亚洲色| 国产亚洲A∨片在线观看| 亚洲精品美女久久久久99| 亚洲精品白浆高清久久久久久| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 国产精品青草视频免费播放| 妇女自拍偷自拍亚洲精品| 亚洲国产成人久久精品软件| 亚洲日韩乱码中文字幕| 亚洲av永久无码一区二区三区| 亚洲av日韩av永久无码电影| 亚洲一区二区三区写真| 青青青亚洲精品国产| 搜日本一区二区三区免费高清视频 |