`
g21121
  • 浏览: 694713 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

连接池c3p0 ,Proxool ,Druid ,Tomcat Jdbc Pool对比测试

阅读更多

        这次所要做的测试是比较几种我们常用的数据库连接池的性能,他们分别是:c3p0 ,Proxool ,Druid ,Tomcat Jdbc Pool这四种,测试将采用统一的参数配置力求比较“公平”的体现统一水平下几种连接池的不同,有网友回复说测试不公平会互相干扰,那我就把代码分开,代码是死的人是活的,做事情不动脑只能吃别人剩下的,世界上没有绝对公平的事情,我在此只提供了一个思路,更多的测试还需要你自己去完成。

 

        1.创建类TestDAO,封装统一的查询方法 :

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestDAO {

    private final static String sql = "SELECT * FROM USER u WHERE u.USR_ID=9999";

    public void query(Connection conn) {
        try {
            Statement st = conn.createStatement();
            ResultSet result = st.executeQuery(sql);
            result.close();
            st.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

 

 

        2.创建测试类TestMain,其中包含:统一参数配置属性、获取各种连接池数据源方法、各种数据源调用方法等,下面分别是各种数据源的测试Main方法,开始测试之前做100次查询操作以初始化连接池并起到稳定测试结果作用:

 

        (1)c3p0测试代码:

import java.beans.PropertyVetoException;
import java.io.IOException;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3p0Test {

    // 数据库驱动名称
    final static String driver = "com.mysql.jdbc.Driver";
    // 数据库连接地址
    final static String jdbcUrl = "jdbc:mysql://192.168.0.1:3306/test";
    // 数据库用户名
    final static String user = "dba";
    // 数据库密码
    final static String passwd = "dba";
    // 连接池初始化大小
    final static int initialSize = 5;
    // 连接池最小空闲
    final static int minPoolSize = 10;
    // 连接池最大连接数量
    final static int maxPoolSize = 50;
    // 最小逐出时间,100秒
    final static int maxIdleTime = 100000;
    // 连接失败重试次数
    final static int retryAttempts = 10;
    // 当连接池连接耗尽时获取连接数
    final static int acquireIncrement = 5;
    // c3p0数据源
    final static ComboPooledDataSource c3p0DataSource = getC3p0DataSource();

    // 查询次数
    final static int count = 10;

    /**
     * 测试方式: 每种数据源配置信息尽量相同,以求结果更加准确
     * 每种数据源做10次、100次、500次、1000次、2000次、4000次、8000次查询操作 每种查询重复100次,查看100次执行时间的波动图
     * @param args
     * @throws IOException
     * @throws SQLException
     */
    public static void main(String[] args) throws IOException, SQLException {

        TestDAO testDAO = new TestDAO();
        System.out.println("查询次数为:" + count);
        System.out.println();
        System.out.println("==========================c3p0 测试开始==========================");
        // 测试c3p0
        for (int i = 0; i < 100; i++) {
            queryC3p0(testDAO, c3p0DataSource, count);
        }
        System.out.println("==========================c3p0 测试结束==========================");
    }

    /**
     * c3p0测试
     * @param testDAO
     * @param ds
     * @param count
     * @throws SQLException
     */
    public static void queryC3p0(TestDAO testDAO, ComboPooledDataSource ds, int count) throws SQLException {
        // 查询100次以初始化连接池
        for (int i = 0; i < 100; i++) {
            testDAO.query(ds.getConnection());
        }
        // 开始时间
        long startMillis = System.currentTimeMillis();
        // 循环查询
        for (int i = 0; i < count; i++) {
            testDAO.query(ds.getConnection());
        }
        // 结束时间
        long endMillis = System.currentTimeMillis();
        // 输出结束时间
        System.out.println(endMillis - startMillis);
    }

    /**
     * 获取c3p0数据源
     * @throws PropertyVetoException
     */
    public static ComboPooledDataSource getC3p0DataSource() {
        // 设置参数
        ComboPooledDataSource cpds = new ComboPooledDataSource();
        try {
            cpds.setDriverClass(driver);
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
        cpds.setJdbcUrl(jdbcUrl);
        cpds.setUser(user);
        cpds.setPassword(passwd);
        cpds.setInitialPoolSize(initialSize);
        cpds.setMinPoolSize(minPoolSize);
        cpds.setMaxPoolSize(maxPoolSize);
        cpds.setMaxIdleTime(maxIdleTime);
        cpds.setAcquireRetryAttempts(retryAttempts);
        cpds.setAcquireIncrement(acquireIncrement);
        cpds.setTestConnectionOnCheckin(false);
        cpds.setTestConnectionOnCheckout(false);
        return cpds;
    }
}

 

 

        (2)Proxool测试代码: 

import java.io.IOException;
import java.sql.SQLException;
import org.logicalcobwebs.proxool.ProxoolDataSource;

public class ProxoolTest {

    // 数据库驱动名称
    final static String driver = "com.mysql.jdbc.Driver";
    // 数据库连接地址
    final static String jdbcUrl = "jdbc:mysql://192.168.0.1:3306/test";
    // 数据库用户名
    final static String user = "dba";
    // 数据库密码
    final static String passwd = "dba";
    // 连接池初始化大小
    final static int initialSize = 5;
    // 连接池最小空闲
    final static int minPoolSize = 10;
    // 连接池最大连接数量
    final static int maxPoolSize = 50;
    // 最小逐出时间,100秒
    final static int maxIdleTime = 100000;
    // 连接失败重试次数
    final static int retryAttempts = 10;
    // 当连接池连接耗尽时获取连接数
    final static int acquireIncrement = 5;
    // Proxool数据源
    final static ProxoolDataSource proxoolDataSource = getProxoolDataSource();
    // 查询次数
    final static int count = 10;

    /**
     * 测试方式: 每种数据源配置信息尽量相同,以求结果更加准确
     * 每种数据源做10次、100次、500次、1000次、2000次、4000次、8000次查询操作 每种查询重复100次,查看100次执行时间的波动图
     * @param args
     * @throws IOException
     * @throws SQLException
     */
    public static void main(String[] args) throws IOException, SQLException {

        TestDAO testDAO = new TestDAO();
        System.out.println("查询次数为:" + count);
        System.out.println();
        System.out.println("==========================Proxool 测试开始==========================");
        // 测试Proxool
        for (int i = 0; i < 100; i++) {
            queryProxxool(testDAO, proxoolDataSource, count);
        }
        System.out.println("==========================Proxool 测试结束==========================");
    }

    /**
     * Proxxool测试
     * @param testDAO
     * @param ds
     * @param count
     * @throws SQLException
     */
    public static void queryProxxool(TestDAO testDAO, ProxoolDataSource ds, int count) throws SQLException {
        // 查询100次以初始化连接池
        for (int i = 0; i < 100; i++) {
            testDAO.query(ds.getConnection());
        }
        // 开始时间
        long startMillis = System.currentTimeMillis();
        // 循环查询
        for (int i = 0; i < count; i++) {
            testDAO.query(ds.getConnection());
        }
        // 结束时间
        long endMillis = System.currentTimeMillis();
        // 输出结束时间
        System.out.println(endMillis - startMillis);
    }

    /**
     * 获取Proxool数据源
     * @return
     */
    public static ProxoolDataSource getProxoolDataSource() {
        ProxoolDataSource pds = new ProxoolDataSource();
        pds.setAlias("mysql");
        pds.setUser(user);
        pds.setPassword(passwd);
        pds.setDriverUrl(jdbcUrl);
        pds.setDriver(driver);
        pds.setMaximumActiveTime(maxIdleTime);
        pds.setMaximumConnectionCount(maxPoolSize);
        pds.setMinimumConnectionCount(initialSize);
        pds.setPrototypeCount(minPoolSize);
        pds.setTestBeforeUse(false);
        pds.setTestAfterUse(false);
        return pds;
    }

}

 

 

        (3)Druid测试代码:

import java.io.IOException;
import java.sql.SQLException;
import com.alibaba.druid.pool.DruidDataSource;

public class DruidTest {

    // 数据库驱动名称
    final static String driver = "com.mysql.jdbc.Driver";
    // 数据库连接地址
    final static String jdbcUrl = "jdbc:mysql://192.168.0.1:3306/test";
    // 数据库用户名
    final static String user = "dba";
    // 数据库密码
    final static String passwd = "dba";
    // 连接池初始化大小
    final static int initialSize = 5;
    // 连接池最小空闲
    final static int minPoolSize = 10;
    // 连接池最大连接数量
    final static int maxPoolSize = 50;
    // 最小逐出时间,100秒
    final static int maxIdleTime = 100000;
    // 连接失败重试次数
    final static int retryAttempts = 10;
    // 当连接池连接耗尽时获取连接数
    final static int acquireIncrement = 5;
    // Druid数据源
    final static DruidDataSource druidDataSource = getDruidDataSource();
    // 查询次数
    final static int count = 10;

    /**
     * 测试方式: 每种数据源配置信息尽量相同,以求结果更加准确
     * 每种数据源做10次、100次、500次、1000次、2000次、4000次、8000次查询操作 每种查询重复100次,查看100次执行时间的波动图
     * @param args
     * @throws IOException
     * @throws SQLException
     */
    public static void main(String[] args) throws IOException, SQLException {

        TestDAO testDAO = new TestDAO();
        System.out.println("查询次数为:" + count);
        System.out.println();
        System.out.println("==========================Druid 测试开始==========================");
        // 测试Druid
        for (int i = 0; i < 100; i++) {
            queryDruid(testDAO, druidDataSource, count);
        }
        System.out.println("==========================Druid 测试结束==========================");
    }

    /**
     * Druid测试
     * @param testDAO
     * @param ds
     * @param count
     * @throws SQLException
     */
    public static void queryDruid(TestDAO testDAO, DruidDataSource ds, int count) throws SQLException {
        // 查询100次以初始化连接池
        for (int i = 0; i < 100; i++) {
            testDAO.query(ds.getConnection());
        }
        // 开始时间
        long startMillis = System.currentTimeMillis();
        // 循环查询
        for (int i = 0; i < count; i++) {
            testDAO.query(ds.getConnection());
        }
        // 结束时间
        long endMillis = System.currentTimeMillis();
        // 输出结束时间
        System.out.println(endMillis - startMillis);
    }

    /**
     * 获取Druid数据源
     * @return
     */
    public static DruidDataSource getDruidDataSource() {
        DruidDataSource dds = new DruidDataSource();
        dds.setUsername(user);
        dds.setUrl(jdbcUrl);
        dds.setPassword(passwd);
        dds.setDriverClassName(driver);
        dds.setInitialSize(initialSize);
        dds.setMaxActive(maxPoolSize);
        dds.setMaxWait(maxIdleTime);
        dds.setTestWhileIdle(false);
        dds.setTestOnReturn(false);
        dds.setTestOnBorrow(false);
        return dds;
    }

}

 

 

        (4)Tomcat Jdbc Pool测试代码:

import java.io.IOException;
import java.sql.SQLException;
import org.apache.tomcat.jdbc.pool.DataSource;

public class TomcatTest {

    // 数据库驱动名称
    final static String driver = "com.mysql.jdbc.Driver";
    // 数据库连接地址
    final static String jdbcUrl = "jdbc:mysql://192.168.0.1:3306/test";
    // 数据库用户名
    final static String user = "dba";
    // 数据库密码
    final static String passwd = "dba";
    // 连接池初始化大小
    final static int initialSize = 5;
    // 连接池最小空闲
    final static int minPoolSize = 10;
    // 连接池最大连接数量
    final static int maxPoolSize = 50;
    // 最小逐出时间,100秒
    final static int maxIdleTime = 100000;
    // 连接失败重试次数
    final static int retryAttempts = 10;
    // 当连接池连接耗尽时获取连接数
    final static int acquireIncrement = 5;
    // Tomcat Jdbc Pool数据源
    final static DataSource tomcatDataSource = getTomcatDataSource();
    // 查询次数
    final static int count = 100;

    /**
     * 测试方式: 每种数据源配置信息尽量相同,以求结果更加准确
     * 每种数据源做10次、100次、500次、1000次、2000次、4000次、8000次查询操作 每种查询重复100次,查看100次执行时间的波动图
     * @param args
     * @throws IOException
     * @throws SQLException
     */
    public static void main(String[] args) throws IOException, SQLException {

        TestDAO testDAO = new TestDAO();
        System.out.println("查询次数为:" + count);
        System.out.println();
        System.out.println("==========================Tomcat Jdbc Pool 测试开始==========================");
        // 测试Tomcat Jdbc Pool
        for (int i = 0; i < 100; i++) {
            queryTomcatJDBC(testDAO, tomcatDataSource, count);
        }
        System.out.println("==========================Tomcat Jdbc Pool 测试结束==========================");
    }

    /**
     * Tomcat Jdbc Pool测试
     * @param testDAO
     * @param ds
     * @param count
     * @throws SQLException
     */
    public static void queryTomcatJDBC(TestDAO testDAO, DataSource ds, int count) throws SQLException {
        // 查询100次以初始化连接池
        for (int i = 0; i < 100; i++) {
            testDAO.query(ds.getConnection());
        }
        // 开始时间
        long startMillis = System.currentTimeMillis();
        // 循环查询
        for (int i = 0; i < count; i++) {
            testDAO.query(ds.getConnection());
        }
        // 结束时间
        long endMillis = System.currentTimeMillis();
        // 输出结束时间
        System.out.println(endMillis - startMillis);
    }

    /**
     * 获取Apache tomcat jdbc pool数据源
     * @return
     */
    public static DataSource getTomcatDataSource() {
        DataSource ds = new DataSource();
        ds.setUrl(jdbcUrl);
        ds.setUsername(user);
        ds.setPassword(passwd);
        ds.setDriverClassName(driver);
        ds.setInitialSize(initialSize);
        ds.setMaxIdle(minPoolSize);
        ds.setMaxActive(maxPoolSize);
        ds.setTestWhileIdle(false);
        ds.setTestOnBorrow(false);
        ds.setTestOnConnect(false);
        ds.setTestOnReturn(false);
        return ds;
    }
}

               

 

 

        3.将测试结果粘贴到excel中,生成图表进行对比,可以很直观的看出几种数据源的性能差异,本文底部有此次测试的结果文档。

 

 

        以下就是此次测试结果(本结果只供参考,更具体更准确的测试可以自行进行):

 

        1.测试次数为10次时:



        平均用时(单位:毫秒):

c3p0 32.26
Proxool 33.42
Druid 30.43
Tomcat Jdbc Pool 37.61

 

 

        2.测试次数为100次时:



        平均用时(单位:毫秒):

c3p0 409.94
Proxool 447.49
Druid 382.7
Tomcat Jdbc Pool 386.3

 

 

        3.测试次数为500次时:


        平均用时(单位:毫秒):

c3p0 1700.95
Proxool 2053.85
Druid 1777.36
Tomcat Jdbc Pool 1749.02

 

 

        4.测试次数为1000次时:



        平均用时(单位:毫秒):

c3p0  3549.29
Proxool  3435.8
Druid  3167.59
Tomcat Jdbc Pool  3162.25

 

        因为测试耗时很长,所以我只做到了1000次查询测试,感兴趣的朋友可以继续更大规模的测试或修改相应参数来符合项目自身情况,这里不比去追究测试数据的准确性,比较测试程度还不够,且存在很大的偶然性,大家可以修改以上代码进行更精准的测试,只需要将数据导入到本文末尾的excel表格中即可生成相应测试图表。

        很多人总是会回复在问“你的测试准不准啊?”,“你的测试一点都不准!”等等,其实我想说的是:不要太在意别人的结果,重要的是自己去做!

 

  • 大小: 98.5 KB
  • 大小: 104.2 KB
  • 大小: 79.7 KB
  • 大小: 75.3 KB
9
4
分享到:
评论
7 楼 ssy341 2013-10-11  
支持一个,方法很全面,可以参考,感觉现在用druid的还是比较少,文档不是很全面
6 楼 iskp 2013-08-06  
g21121 写道
iskp 写道
楼主,明显改过这篇文章,昨天的测试结果让我很意外,今天的结果还算是正常。


这种测试其实存在很大偶然性,比较片面


主要是测试的差距有点偏大,也许是测试用例的设计不一样
5 楼 g21121 2013-08-06  
iskp 写道
楼主,明显改过这篇文章,昨天的测试结果让我很意外,今天的结果还算是正常。


这种测试其实存在很大偶然性,比较片面
4 楼 iskp 2013-08-06  
楼主,明显改过这篇文章,昨天的测试结果让我很意外,今天的结果还算是正常。

3 楼 Tyrion 2013-08-05  
g21121 写道
Tyrion 写道
Druid是阿里系的吧,据说性能方面超过了其它同类产品,博主是生产环境中用过?

是阿里巴巴的,生产中没有用到过,我也是听“据说性能非常好”才做测试的,图片里面绿色的就是Druid,某些方面性能还是可以的,但开源项目文档方面非常差


前段时间看了Druid作者放在github上的介绍,对于使用者最主要的担心是Druid目前太小众,出了问题只能找阿里的人回答或自己研究源码,对于有项目进度压力的情况下这个肯定不是首选。
2 楼 g21121 2013-08-05  
Tyrion 写道
Druid是阿里系的吧,据说性能方面超过了其它同类产品,博主是生产环境中用过?

是阿里巴巴的,生产中没有用到过,我也是听“据说性能非常好”才做测试的,图片里面绿色的就是Druid,某些方面性能还是可以的,但开源项目文档方面非常差
1 楼 Tyrion 2013-08-05  
Druid是阿里系的吧,据说性能方面超过了其它同类产品,博主是生产环境中用过?

相关推荐

    JAVA数据库连接池(C3P0,Druid,JNDI ,DBCP,Proxool,BoneCP)

    本文将详细介绍几个常见的Java数据库连接池实现:C3P0、Druid、JNDI、DBCP、Proxool以及BoneCP,并结合Spring+MyBatis+maven环境下的应用示例进行解析。 1. C3P0: C3P0是一个开源的JDBC连接池,它实现了数据源和...

    c3p0、proxool、dbcp数据库连接池

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0的核心功能包括: 1. **连接池管理**:自动创建、配置并管理数据库连接,避免频繁创建和销毁连接造成的性能开销。 2....

    三大连接池参数说明(DBCP\C3P0\Proxool)

    【三大连接池参数详解】 ...总结来说,三大连接池——DBCP、C3P0 和 Proxool,各有其特点和配置选项。选择合适的连接池并正确配置这些参数,能够提高数据库操作的效率,减少资源消耗,并确保系统的稳定运行。

    C3P0连接池jar,proxool连接池jar 下载

    NULL 博文链接:https://lanyan-lan.iteye.com/blog/509140

    HIbernate连接池配置总结基于第三方c3p0和proxool

    为了确保连接池的健康运行,可以启用连接池的监控和诊断功能,比如C3P0提供了日志输出和监控网页,便于查看连接池的状态,及时发现并解决问题。 总的来说,选择和配置适合的Hibernate连接池是优化数据库性能的关键...

    proxool连接池使用详细说明

    虽然Proxool功能强大,但与C3P0、HikariCP、DBCP等其他连接池相比,Proxool的活跃度较低,社区支持和更新较少。因此,在选择连接池时,应根据项目需求和社区活跃度进行评估。 总的来说,Proxool连接池提供了一种...

    DBPoolDemo:jdbc 池,包含 C3P0、DBCP、Proxool、Druid、tomcat-jdbc

    本篇文章将详细讲解标题中提到的五种主流Java数据库连接池:C3P0、DBCP、Proxool、Druid以及tomcat-jdbc,并逐一分析它们的特点、使用方法以及优缺点。 1. **C3P0** C3P0是一个开源的JDBC连接池,它实现了数据源和...

    Java Spring常用高性能连接池以及属性

    * C3P0比较耗费资源,效率方面可能要低一点。 * DBCP在实践中存在BUG,在某些种情会产生很多空连接不能释放,Hibernate3.0已经放弃了对其的支持。 * Proxool的负面评价较少,现在比较推荐它,而且它还提供即时监控...

    数据连接池用法(C3PO,proxool,dbcp,bonecp)

    1. 导入必要的依赖库,包括c3p0-0.9.1.2.jar、commons-logging-1.1.1.jar和spring-2.5.6.jar。 2. 在Spring的配置文件(如`applicationContext.xml`)中声明C3PO的数据源,设置相应的数据库连接属性,如驱动类、URL...

    JAVA数据库连接池proxool

    Java数据库连接池(JDBC Connection Pool)是一种管理数据库连接的技术,它通过预先创建并维护一定数量的数据库连接,为应用程序提供高效、便捷的数据库访问方式。Proxool是Apache Software Foundation开发的一个...

    java连接池proxool

    3. 在Java代码或JSP页面中,通过JDBC的DriverManager获取连接时,使用Proxool的定制URL,以便从连接池中获取连接。 4. 使用完数据库连接后,不需手动关闭,而是让Proxool自动回收。 你的压缩包中的"连接池"文件可能...

    proxool连接池

    标题中的"proxool连接池"和描述中的"tomcat模拟连接池"都指向了Proxool在Tomcat应用服务器中的应用。下面将详细讲解Proxool连接池的工作原理、配置方法以及在Tomcat中的使用。 ### 1. Proxool简介 Proxool是一个...

    数据库连接池包(proxool.jar)

    Proxool与其他连接池(如C3P0、DBCP、HikariCP等)相比,有其独特的优点和特性,例如: - **轻量级**: Proxool的内存占用相对较小,适合小型项目或者资源有限的环境。 - **动态扩展性**: 可以动态调整连接池的大小...

    proxool连接池配置

    -- 连接池的别名 --&gt; &lt;alias&gt;DBPool&lt;/alias&gt; - &lt;!-- proxool只能管理由自己产生的连接 --&gt; &lt;driver-url&gt;jdbc:sqlserver://localhost:1433;dataBaseName=books&lt;/driver-url&gt; - &lt;!-- JDBC驱动程序 --&gt; ...

    proxool+mysql+tomcat连接池所需jar包

    本文将详细介绍"proxool+mysql+tomcat连接池所需jar包"的相关知识,以及如何在实际项目中配置和使用。 首先,我们要理解连接池的基本概念。数据库连接池是在应用服务器启动时预创建一定数量的数据库连接,然后在...

    proxool数据库连接池实例(带监控功能)

    Proxool与其他连接池如C3P0、DBCP等相比,具有配置灵活、监控能力强的特点。在Java应用中,Proxool能够与JDBC无缝集成,为应用程序提供高效的数据访问服务。 **Proxool的基本工作原理:** Proxool维护一个连接池,...

    java JDBC连接池

    Java JDBC连接池是一种高效管理数据库连接的技术,它允许...在实际开发中,除了Proxool外,还有其他流行的连接池实现,如C3P0、DBCP、HikariCP和Apache DBCP2等,它们各有优缺点,可以根据项目需求选择适合的连接池。

Global site tag (gtag.js) - Google Analytics