`
mymobile
  • 浏览: 181030 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

commons DBCP 配置说明 (转贴)

阅读更多

 

前段时间因为项目原因,要在修改数据库连接池到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 >
为了您的安全,请只打开来源可靠的网址

打开网站     取消

来自: http://hi.baidu.com/danghj/blog/item/f81da935288bc08ea61e12fd.html
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics