本帖最后由 Zh_java_2009 于 2013-07-10 15:08:36 编辑

解决方案 »

  1.   


    c3p0配置<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${jdbc.driverClassName}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="minPoolSize" value="5"/>
            <property name="maxPoolSize" value="300"/>
            <property name="initialPoolSize" value="10"/>
            <property name="maxIdleTime" value="1800"/>    //1800释放会不会过长? 
            <property name="acquireIncrement" value="5"/>
       <property name="acquireRetryAttempts" value="30"/>
       <property name="breakAfterAcquireFailure" value="true"/>
      
       <property name="testConnectionOnCheckin" value="true"/>
       <property name="automaticTestTable" value="C3P0TestTable" />
         <property name="idleConnectionTestPeriod" value="18000" />
         <property name="testConnectionOnCheckout" value="true" />
       </bean>
    按理说 <property name="maxIdleTime" value="1800"/> ,这样半小时就会自动释放,自己测试的时候也是如此.其他参数也不觉得有什么不正常
    但是实际情况往往就是这样的意外还有就是关于这个的自动测试,会非常占用内存吗?监控到每天自动测连接的时候cpu暂用率会飙升
      

  2.   


    昨天用loadrunner测试并发登录,当系统挂掉的时候,查看了连接情况,和帖子链接文档中的情形类似。。
    换句话说,不停的登录登录登录,系统就会被干掉,可能会出现上面的情况,现在还在读代码中,看看哪儿能优化优化。稍稍问一下情况1:
    我去搜索了一下表类型的介绍,发现MyISAM引擎不支持事务,现在怀疑由于并发登录过多(登录采用的是ajax的异步处理),程序中的事务处理未能起到作用,导致表T_USER_LOGS被干掉这个有可能吗?
      

  3.   

    刚才又将maxIdleTime设置为60,方便观察释放情况
    图如下
    只有红框中的10个连接是按时关闭,然后又自动创建10个新的连接。。为毛上面那200多个连接 不会释放啊 想半天没想到为何,也不知道如何下手
      

  4.   

    使用中的连接,连接池并不会强制释放。
    maxIdleTime 是释放那些长期没有被使用的数据库连接,可以一直释放到仅剩minPoolSize数量为止。自动测试没必要开,你已经开启了testConnectionOnCheckout,其它其实都没必要开启了。
    连接池应该不会引发“Waiting for table”的问题,恐怕不需要从连接池进行分析。做个实验:
    当程序发生大量“Waiting for table”时,单独用一个Java程序,以JDBC方式去操作MySQL的T_USER_LOGS表,看看是否会被锁住?