转帖Apache DBCP连接池使用Tip

使用Apache Commons DBCP配置多个数据库访问使用中有一些经验,小Tip记录下来。 

1.  BasicDataSource配置maxWait参数(单位为ms),在getConnection()得不到Connection时(例如由于连接池用光)超时maxWait毫秒将会抛出异常(例如org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted)。默认不配置该参数,getConnection()方法将等待到有连接可用,通常的情况是,如果连接池用光,此方法将一直等待不返回。 

2. maxActive为连接池大小。maxIdle为连接池内保持的空闲连接最大数, minIdle为连接池保持的空闲连接最小数 

3. 通过BasicDataSource 对象getConnection()获得的Connection,在使用完之后一定要关闭( conn.close() )!  在短期内频繁访问不关闭Connection的数据库操作方法,将很快把连接池用光(原来错误以为连接池会自动回收Connection的想法是错误的,从连接池出来的Connection,调用conn.close其实不是关闭Connection,而是回收),Connection的自动释放通常需要很长的时间(甚至怀疑能不能自动释放),所以程序里面不关闭的后果就是后来一直得不到Connection。不管是查询还是更新方法都要关闭。 

自己做了个论坛程序,在测试时发现,进行几次与数据库的交互操作后,程序就会无响应。研究后发现,是因为DBCP连接池没有进行正确的配置。通过改变配置后,没有再出现程序无响应的情况发生。 

原来的applicationContext.xml中的DBCP配置如下: 



    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
        <!-- driver for Derby--> 
        <property name="driverClassName"> 
            <value>org.apache.derby.jdbc.ClientDriver</value> 
        </property> 
        <property name="url"> 
            <value>jdbc:derby://localhost:1527/sample;create=true</value> 
        </property> 
        <property name="username"> 
            <value>ahoo</value> 
        </property> 
        <property name="password"> 
            <value>ahoo</value> 
        </property> 
</bean> 


修改后如下: 





    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
        <!-- driver for Derby--> 
        <property name="driverClassName"> 
            <value>org.apache.derby.jdbc.ClientDriver</value> 
        </property> 
        <property name="url"> 
            <value>jdbc:derby://localhost:1527/sample;create=true</value> 
        </property> 
        <property name="username"> 
            <value>ahoo</value> 
        </property> 
        <property name="password"> 
            <value>ahoo</value> 
        </property> 
        <!-- 初始化连接 --> 
        <property name="initialSize"> 
            <value>20</value> 
        </property> 
        <!-- 最大连接数量 --> 
        <property name="maxActive"> 
            <value>100</value> 
        </property> 
        <!-- 最大空闲连接 --> 
        <property name="maxIdle"> 
            <value>30</value> 
        </property> 
        <!-- 最小空闲连接 --> 
        <property name="minIdle"> 
            <value>10</value> 
        </property> 
        <!-- 是否在自动回收超时连接的时候打印连接的超时错误 --> 
        <property name="logAbandoned"> 
            <value>true</value> 
        </property> 
        <!-- 是否自动回收超时连接 --> 
        <property name="removeAbandoned"> 
            <value>true</value> 
        </property> 
        <!-- 超时时间(以s为单位) --> 
        <property name="removeAbandonedTimeout"> 
            <value>20</value> 
        </property> 
        <!-- 超时等待时间(以ms为单位) --> 
        <property name="maxWait"> 
            <value>1000</value> 
        </property> 
    </bean> 

maxIdle,最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连 
接将被标记为不可用,然后被释放。设为0表示无限制。 
MaxActive,连接池的最大数据库连接数。设为0表示无限制。 
maxWait ,最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示 
无限制。 

*maxActive:最大连接数据库连接数,设 0 为没有限制 
*maxIdle:最大等待连接中的数量,设 0 为没有限制 
*maxWait:最大等待毫秒数, 单位为 ms, 超过时间会出错误信息 

一般把maxActive设置成可能的并发量就行了 

maxActive、maxIdle和maxWait参数: 


maxActive是最大激活连接数,这里取值为20,表示同时最多有20个数据库连  
 接。maxIdle是最大的空闲连接数,这里取值为20,表示即使没有数据库连接时依然可以保持20空闲的 

连接,而不被清除,随时处于待命状态。MaxWait是最大等待秒钟数,这里取值-1,表示无限等待,直到 

超时为止,也可取值9000,表示9秒后超时。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用DBCP连接池需要在配置文件中设置以下属性: 1. 驱动类名(driverClassName):数据库驱动程序的名称,例如com.mysql.jdbc.Driver。 2. 数据库连接URL(url):连接到数据库的URL,例如jdbc:mysql://localhost:3306/test。 3. 数据库用户名(username):连接到数据库所需的用户名。 4. 数据库密码(password):连接到数据库所需的密码。 5. 初始连接数(initialSize):连接池在启动时创建的初始连接数。 6. 最小空闲连接数(minIdle):连接池中保留的最小空闲连接数。 7. 最大活动连接数(maxActive):连接池中同时可分配的最大活动连接数。 8. 最大等待时间(maxWait):等待连接池分配连接的最长时间(以毫秒为单位)。 9. 连接池名(poolName):连接池的名称。 下面是一个示例配置文件: ```xml <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="password" /> <property name="initialSize" value="5" /> <property name="minIdle" value="2" /> <property name="maxActive" value="20" /> <property name="maxWait" value="10000" /> <property name="poolPreparedStatements" value="true" /> <property name="maxOpenPreparedStatements" value="100" /> <property name="poolName" value="MyDBCP" /> </bean> ``` 在上面的配置中,我们使用了org.apache.commons.dbcp.BasicDataSource类,它是DBCP连接池的实现类。我们设置了MySQL数据库的驱动程序名称、URL、用户名和密码。我们还设置了连接池的一些属性,例如初始连接数、最小空闲连接数、最大活动连接数和最大等待时间。最后,我们指定了连接池的名称为MyDBCP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值