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 閱讀(11206) 評論(0)  編輯  收藏 所屬分類: JAVAJSP
          主站蜘蛛池模板: 临漳县| 无棣县| 阿拉善盟| 陇西县| 赤峰市| 腾冲县| 东丰县| 牟定县| 阿拉善盟| 兴山县| 武穴市| 黄冈市| 招远市| 汉川市| 建瓯市| 顺义区| 邢台市| 同心县| 大邑县| 海宁市| 西乌珠穆沁旗| 尖扎县| 锦屏县| 杨浦区| 图木舒克市| 福建省| 临洮县| 上高县| 青神县| 西青区| 靖江市| 封丘县| 长海县| 临海市| 卫辉市| 弋阳县| 永安市| 鹰潭市| 微山县| 桃源县| 宣威市|