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

[经验分享] c3p0配置以及连接MySQL数据库timeout的问题

[复制链接]

尚未签到

发表于 2016-10-21 04:00:22 | 显示全部楼层 |阅读模式
一、
经过N多试验,终于自己把这个问题搞定了。

网上关于C3P0在spring中的配置,几乎没有完全正确的(至少我还没发现)。查了c3p0的文档,又试验过N次。得出如下配置是正确的:


<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
      <property name="driverClass"><value>${jdbc.driverClassName}</value></property>
      <property name="jdbcUrl"><value>${jdbc.url}</value></property>            
      <property name="user"><value>${jdbc.username}</value></property>
      <property name="password"><value>${jdbc.password}</value></property>
      
      <property name="minPoolSize"><value>1</value></property>
      <property name="maxPoolSize"><value>20</value></property>
      <property name="maxIdleTime"><value>1800</value></property>
      <property name="acquireIncrement"><value>2</value></property>
      <property name="maxStatements"><value>0</value></property>
      <property name="initialPoolSize"><value>2</value></property>
      <property name="idleConnectionTestPeriod"><value>1800</value></property>
      <property name="acquireRetryAttempts"><value>30</value></property>
      <property name="breakAfterAcquireFailure"><value>true</value></property>
      <property name="testConnectionOnCheckout"><value>false</value></property>
      
      <!--
         <property name="properties">
      <props>            
             <prop key="c3p0.minPoolSize">1</prop>
             <prop key="c3p0.maxPoolSize">10</prop>
             <prop key="c3p0.maxIdleTime">1800</prop>            
             <prop key="c3p0.acquireIncrement">2</prop>
             <prop key="c3p0.maxStatements">0</prop>
                   <prop key="c3p0.initialPoolSize">2</prop>
             <prop key="c3p0.idleConnectionTestPeriod">1800</prop>
             <prop key="c3p0.acquireRetryAttempts">30</prop>
             <prop key="c3p0.breakAfterAcquireFailure">true</prop>
             <prop key="c3p0.testConnectionOnCheckout">true</prop>
             <prop key="user">root</prop>
             <prop key="password">999999</prop>
            
      </props>
      </property>
       -->   
</bean>

<!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
   <property name="dataSource" ref="dataSource"/>
   <property name="mappingDirectoryLocations">
   <list>
<value>classpath:/com/licaionline/domain/</value>
   </list>
   </property>
   <property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    <prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
            <prop key="hibernate.connection.release_mode">auto</prop>                  
            <prop key="hibernate.autoReconnect">true</prop>
            <prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
            <!--
<prop key="hibernate.useUnicode"></prop>
<prop key="hibernate.characterEncoding"></prop>
<prop key="hibernate.default-lazy-init"></prop>
            <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>   
-->
                              
            <!--
            <prop key="hibernate.c3p0.acquire_increment">2</prop>
            <prop key="hibernate.c3p0.idle_test_period">1800</prop>
            <prop key="hibernate.c3p0.timeout">1800</prop>
            <prop key="hibernate.c3p0.max_size">30</prop>
            <prop key="hibernate.c3p0.min_size">2</prop>
            <prop key="hibernate.c3p0.max_statements">50</prop>
-->      
</props>
   </property>




注意:注释掉的那些,都是错误的。网上流行的,基本上跟注释掉的那些差不多。配错了,并无异常,还是能正常使用。但是所作的配置不起作用。


二、
起作用的,是datasource里面的这一句:
<property name="maxIdleTime"><value>1800</value></property>

这儿设置成每隔1800秒就扫描一次,检查一下空闲的链接。所以,用户基本上不会得到空闲的链接了。

如果再不放心,
<property name="testConnectionOnCheckout"><value>false</value></property>
这儿设置成true。每次连接之前,都要测一下。但是这样会影响效率。


三、

解决的方法有3种:

增加wait_timeout的时间。
减少Connection pools中connection的lifetime。
测试Connection pools中connection的有效性。
当然最好的办法是同时综合使用上述3种方法,下面就DBCP和C3P0分别做一说明,假设wait_timeout为默认的8小时

DBCP增加以下配置信息:

//set to 'SELECT 1'
validati
//set to 'true'
testWhileIdle = "true"   
//some positive integer
timeBetweenEvictionRunsMillis = 3600000
//set to something smaller than 'wait_timeout'
minEvictableIdleTimeMillis = 18000000
//if you don't mind a hit for every getConnection(), set to "true"
test

C3P0增加以下配置信息:

//set to 'SELECT 1'   
preferredTestQuery = 'SELECT 1'   
//set to something much less than wait_timeout, prevents connections from going stale
idleConnectionTestPeriod = 18000   
//set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out
maxIdleTime = 25000   
//if you can take the performance 'hit', set to "true"
testConnectionOnCheckout = true   

更多的配置信息大家可以查看C3P0文档,Connector/J文档,以及DBCP的文档。

运维网声明 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-288941-1-1.html 上篇帖子: mysql给已存在的表添加外键 下篇帖子: 在MySQL中如何查询唯一最低值
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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