设为首页 收藏本站
查看: 383|回复: 0

[经验分享] 转帖Apache DBCP连接池使用Tip

[复制链接]
发表于 2017-1-10 10:41:11 | 显示全部楼层 |阅读模式
使用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秒后超时。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-326459-1-1.html 上篇帖子: Apache端口冲突之占用80端口的常用软件 下篇帖子: lucene:no segments* file found in org.apache.lucen
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表