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

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

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

    posts - 495,comments - 227,trackbacks - 0

      前段時間因為項目原因,要在修改數據庫連接池到DBCP上,折騰了半天,有一點收獲,不敢藏私,特在這里與朋友們共享。
      在配置時,主要難以理解的主要有:removeAbandoned 、logAbandoned、removeAbandonedTimeout、maxWait這四個參數,設置了rmoveAbandoned=true那么在getNumActive()快要到getMaxActive()的時候,系統會進行無效的Connection的回收,回收的Connection為removeAbandonedTimeout(默認300秒)中設置的秒數后沒有使用的Connection,激活回收機制好像是getNumActive()=getMaxActive()-2。 :) 有點忘了。
      logAbandoned=true的話,將會在回收事件后,在log中打印出回收Connection的錯誤信息,包括在哪個地方用了Connection卻忘記關閉了,在調試的時候很有用。
      在這里私人建議maxWait的時間不要設得太長,maxWait如果設置太長那么客戶端會等待很久才激發回收事件。
      以下是我的配置的properties文件:
    #連接設置
    jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
    jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:DBSERVER
    jdbc.username=user
    jdbc.password=pass

    #<!-- 初始化連接 -->
    dataSource.initialSize=10

    #<!-- 最大空閑連接 -->
    dataSource.maxIdle=20

    #<!-- 最小空閑連接 -->
    dataSource.minIdle=5

    #最大連接數量
    dataSource.maxActive=50

    #是否在自動回收超時連接的時候打印連接的超時錯誤
    dataSource.logAbandoned=true

    #是否自動回收超時連接
    dataSource.removeAbandoned=true

    #超時時間(以秒數為單位)
    #設置超時時間有一個要注意的地方,超時時間=現在的時間-程序中創建Connection的時間,如果maxActive比較大,比如超過100,那么removeAbandonedTimeout可以設置長一點比如180,也就是三分鐘無響應的連接進行回收,當然應用的不同設置長度也不同。
    dataSource.removeAbandonedTimeout=180

    #<!-- 超時等待時間以毫秒為單位 -->
    #maxWait代表當Connection用盡了,多久之后進行回收丟失連接
    dataSource.maxWait=1000

      以下是我在連接控制中調用的方法:

            Properties  dbProps=null;
      //下面的讀取配置文件可以根據實際的不同修改
            dbProps = ConfigProperties.getInstance().getProperties("jdbc.properties");
            try {
             String driveClassName = dbProps.getProperty("jdbc.driverClassName");
             String url = dbProps.getProperty("jdbc.url");
             String username = dbProps.getProperty("jdbc.username");
             String password = dbProps.getProperty("jdbc.password");
             
             String initialSize = dbProps.getProperty("dataSource.initialSize");
             String minIdle = dbProps.getProperty("dataSource.minIdle");
             String maxIdle = dbProps.getProperty("dataSource.maxIdle");
             String maxWait = dbProps.getProperty("dataSource.maxWait");
             String maxActive = dbProps.getProperty("dataSource.maxActive");
               //是否在自動回收超時連接的時候打印連接的超時錯誤
              boolean logAbandoned = (Boolean.valueOf(dbProps.getProperty("dataSource.logAbandoned","false"))).booleanValue();

              //是否自動回收超時連接
              boolean removeAbandoned = (Boolean.valueOf(dbProps.getProperty("dataSource.removeAbandoned","false"))).booleanValue();

              //超時時間(以秒數為單位)
              int removeAbandonedTimeout = Integer.parseInt(dbProps.getProperty("dataSource.removeAbandonedTimeout","300"));
            
             dataSource = new BasicDataSource();
             dataSource.setDriverClassName(driveClassName);
             dataSource.setUrl(url);
             dataSource.setUsername(username);
             dataSource.setPassword(password);

             //初始化連接數
             if(initialSize!=null)
              dataSource.setInitialSize(Integer.parseInt(initialSize));
             
             //最小空閑連接
             if(minIdle!=null)
              dataSource.setMinIdle(Integer.parseInt(minIdle));

             //最大空閑連接
             if(maxIdle!=null)
              dataSource.setMaxIdle(Integer.parseInt(maxIdle));
             
             //超時回收時間(以毫秒為單位)
             if(maxWait!=null)
              dataSource.setMaxWait(Long.parseLong(maxWait));
             
             //最大連接數
             if(maxActive!=null){
              if(!maxActive.trim().equals("0"))
               dataSource.setMaxActive(Integer.parseInt(maxActive));
             }

             System.out.println("logAbandoned="+logAbandoned);
                dataSource.setLogAbandoned(logAbandoned);
             dataSource.setRemoveAbandoned(removeAbandoned);
             dataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout);
             
             Connection conn = dataSource.getConnection();
             if(conn==null){
              log.error("創建連接池時,無法取得連接!檢查設置!!!");
             }else{
              conn.close();
             }
             log.error("連接池創建成功!!!");
            }
            catch (Exception e) {
                  log.error("創建連接池失敗!請檢查設置!!!");
            }

    有誤的地方歡迎指正!      by yy。。。。。。



    Hibernate支持DBCP包進行數據庫連接池的配置。簡要說明配置過程:
    (僅僅是個人摸索,如有問題,歡迎指點)
    需要的包:
    Commons-Pool (下載地址:http://jakarta.apache.org/commons/pool/) :提供一個一般對象池的接口,而且包含實現了通常池工具箱。
    Commons-DBCP(下載地址:http://jakarta.apache.org/commons/dbcp/) :提供數據庫連接池服務。DBCP很聰明,把Commons-Pool和JDBC的driver封裝起來,使達到連接池的目的。

    Hibernate屬性文件的配置參數
    #連接池的最大活動個數
    hibernate.dbcp.maxActive 100
    #當連接池中的連接已經被耗盡的時候,DBCP將怎樣處理( 0 = 失敗, 1 = 等待, 2= 增長)
    hibernate.dbcp.whenExhaustedAction 1
    #最大等待時間
    hibernate.dbcp.maxWait 120000
    #沒有人用連接的時候,最大閑置的連接個數。
    hibernate.dbcp.maxIdle 10
    ##以下是對prepared statement的處理,同上。
    hibernate.dbcp.ps.maxActive 100
    hibernate.dbcp.ps.whenExhaustedAction 1
    hibernate.dbcp.ps.maxWait 120000
    hibernate.dbcp.ps.maxIdle 10

    ## 可選,是否對池化的連接進行驗證
    #給出一條簡單的sql語句進行驗證
    #hibernate.dbcp.validationQuery select 1 from dual
    #在取出連接時進行有效驗證
    #hibernate.dbcp.testOnBorrow true
    #在放回連接時進行有效驗證
    #hibernate.dbcp.testOnReturn false

    #Hibernate已經實現了DBCP Provider實現,別忘了在下面的鍵值去掉#字符
    hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider



    1. <property name="connection.pool.size">2</property>  
    2. <property name="statement_cache.size">25</property>  
    3. <property name="jdbc.fetch_size">50</property>  
    4. <property name="jdbc.batch_size">30</property>  
    5.   
    6. <property name="show_sql">true</property>  
    7. <property name="connection.provider_class">net.sf.hibernate.connection.DBCPConnectionProvider</property>  
    8. <property name="dbcp.maxActive">100</property>  
    9. <property name="dbcp.whenExhaustedAction">1</property>  
    10. <property name="dbcp.maxWait">120000</property>  
    11. <property name="dbcp.maxIdle">10</property>  
    12. <property name="dbcp.ps.maxActive">100</property>  
    13. <property name="dbcp.ps.whenExhaustedAction">1</property>  
    14. <property name="dbcp.ps.maxWait">120000</property>  
    15. <property name="dbcp.ps.maxIdle">100</property>  
    posted on 2007-05-25 15:45 SIMONE 閱讀(11208) 評論(0)  編輯  收藏 所屬分類: JAVAJSP
    主站蜘蛛池模板: 亚洲成a人一区二区三区| 免费一区二区三区| 四虎永久在线观看免费网站网址| 亚洲国产精品无码专区| 巨胸狂喷奶水视频www网站免费| 夜色阁亚洲一区二区三区| 国产亚洲精品国产福利在线观看| 成人在线视频免费| 亚洲欧美日韩中文无线码 | **aaaaa毛片免费同男同女| 亚洲色图国产精品| 人妻无码久久一区二区三区免费| 亚洲今日精彩视频| 国产成人aaa在线视频免费观看 | 国产精品另类激情久久久免费 | 成年女人视频网站免费m| 中文字幕的电影免费网站| 色婷五月综激情亚洲综合 | 亚洲精品福利视频| 波多野结衣一区二区免费视频| 免费人成视频在线观看免费| 不卡一卡二卡三亚洲| 免费一级不卡毛片| 免费看又黄又爽又猛的视频软件| 亚洲天堂福利视频| 国产在线98福利播放视频免费| 久久久久久久岛国免费播放| 中文文字幕文字幕亚洲色| 亚洲高清国产AV拍精品青青草原| 日本午夜免费福利视频| 亚美影视免费在线观看| 亚洲国产精品久久久久久| 亚洲av无码成人精品区| 成人毛片免费观看视频在线| 热re99久久6国产精品免费| 一级毛片大全免费播放| 亚洲伊人久久大香线蕉苏妲己| 最近中文字幕免费mv视频7| 久久精品免费电影| 国产亚洲人成在线播放| 亚洲国产精品无码中文字|