c3p0,dbcp和proxool使用心德

来源:互联网 发布:淘宝号一天刷几单安全 编辑:程序博客网 时间:2024/05/08 01:26
快过年了,大家都在网上订票了,铁道部的订票网的访问速度,实在是太让人感动了。本人受到刺激后,对自己的框架做了一次性能优化,首先从数据库连接池开始。
    关于c3p0、dbcp和proxool,之类的比较,配置在网上有很多的文章,我这边就不浪费大家的时间了,主要讲下我用过这三个之后的体会。
  1. dbcp:框架以前使用的是dbcp,网上说,有很多BUG,至少,这些BUG,我是没有碰到过,从我们系统运行的情况来看,还可以,没什么太多问题,也许是我们的系统访问量不是太大(现在每日平台30个并发左右)。但有个非常坑爹场景,我们测试环境上,大大小小有8个项目在跑,数据库是跟一个ftp服务器搭建在一起(资源有限,没办法的事),ftp服务会经常重启,一重启,dbcp就无法自动连接了,那8个项目要重新启动一下才行。肯定有人会问,把那个数据库放到不经常重启的机器上,不就可以了吗?是的,这是一个办法,但还是不能回避dbcp无法自动重连的问题。
  2. c3p0:框架目前使用的是c3p0,这个是在网上,也有很相关的文章,同时,也是hibernate推荐的,在这里不浪费大家的时间了。该连接池解决了dbcp无法自动重连问题,在稳定性方面,甚少我们的系统还不错。
  3. proxool:关于这个连接池,网上说的例子也有很多,说是性能最好的一个连接池,坑爹的是,网上讲的它跟spring的整合,有很多都是不对的,直接通过spring配置就可以了,没有必要像网上说的,把listener,改成servlet,直接通过spring的bean配置就可以了,这个在网也有很多。关于这个连接池,我在测试时,发现默认情况下,是不会自动重连的,需要通过如下配置:                                <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.logicalcobwebs.proxool.ProxoolDriver" />
          <property name="url" value="xxxx.xml" />
    </bean> 在xxxx.xml里配置                                                                     <proxool>
        <alias>pool</alias>
        <driver-url>jdbc:mysql://192.168.1.4:3306/MIGRATE_TEST?characterEncoding=utf- 8&autoReconnect=true</driver-url>
        <driver-class>com.mysql.jdbc.Driver</driver-class>
        <driver-properties>
            <property name="user" value="website" />
            <property name="password" value="website" />
            <property name="autoReconnect" value="true" />
        </driver-properties>
        <minimum-connection-count>1</minimum-connection-count>
        <maximum-connection-count>8</maximum-connection-count>
        <prototype-count>1</prototype-count>
        <test-before-use>true</test-before-use>
        <house-keeping-sleep-time>60000</house-keeping-sleep-time>
    </proxool> mysql的URL的后面要加上autoReconnect=true,值得注意的是,当使用ibatis时,日志会报warn:registered a statement as closed which wasn't known to be open. 那是因为在ibatis
      package org.springframework.orm.ibatis;
      public class SqlMapClientTemplate extends JdbcAccessor implements SqlMapClientOperations {
         public <T> T execute(SqlMapClientCallback<T> action) throws DataAccessException {
         ..........
         finally {
            // Only close SqlMapSession if we know we've actually opened it
            // at the present level.
            if (ibatisCon == null) {
                session.close();// 由这段引起的,池ibatisCon不为空时,session永远不会关闭
            }
        }
         }

      }
      将红色部分改为 if (ibatisCon != null),就行了
    4. 根据以上三种连接池的情况来看,在首次访问时,dbcp大约需要600毫秒,c3p0需要450毫秒,proxool需要1356毫秒,访问后,速度基本都在几十毫秒以内,除非sql写得很复杂。
以上的测试毫秒数,只是本人根据日志来反映的,不据参考价值,虽然网上说proxool性能最好,我觉得,还是自己使用后才知道真正的性能,所以我选择c3p0来试试,看看效果
0 0