<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 閱讀(11202) 評論(0)  編輯  收藏 所屬分類: JAVAJSP
    主站蜘蛛池模板: 欧美a级成人网站免费| 老牛精品亚洲成av人片| 亚洲中文无韩国r级电影| 99视频全部免费精品全部四虎| 四虎永久免费地址在线网站| 久久免费的精品国产V∧| 国产99视频精品免费视频76| 日韩色日韩视频亚洲网站| 亚洲AV日韩AV永久无码久久| 亚洲国产成人久久综合野外| 精品国产精品久久一区免费式| 亚洲精品色在线网站| 久久亚洲精品无码aⅴ大香| 亚洲综合国产一区二区三区| 四虎精品亚洲一区二区三区| 成年人在线免费观看| 一个人免费观看视频www| 亚洲三级在线免费观看| 日本视频在线观看永久免费| 福利免费在线观看| 9i9精品国产免费久久| 天堂亚洲免费视频| 全部在线播放免费毛片| 亚洲精品色在线网站| 欧美激情综合亚洲一二区| 亚洲熟女精品中文字幕| 亚洲第一男人天堂| 中日韩亚洲人成无码网站| 亚洲国产熟亚洲女视频| 亚洲一区二区三区免费观看| 亚洲一线产区二线产区精华| 亚洲中文无码线在线观看| 亚洲制服丝袜一区二区三区| 亚洲国产日韩在线成人蜜芽| 精品亚洲国产成人| 色天使亚洲综合在线观看| 亚洲精品动漫免费二区| 国产成人高清亚洲一区久久| 免费人成再在线观看网站| 特a级免费高清黄色片| 国产精品九九久久免费视频|