这次所要做的测试是比较几种我们常用的数据库连接池的性能,他们分别是: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,其中包含:统一参数配置属性、获取各种连接池数据源方法、各种数据源调用方法等,代码较长但不难理解:

import java.beans.PropertyVetoException;
import java.io.IOException;
import java.sql.SQLException;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.logicalcobwebs.proxool.ProxoolDataSource;
import com.alibaba.druid.pool.DruidDataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource; public class TestMain { // 数据库驱动名称
static String driver = "com.mysql.jdbc.Driver"; // 数据库连接地址
static String jdbcUrl = "jdbc:mysql://192.168.0.1:3306/test"; // 数据库用户名
static String user = "dba"; // 数据库密码
static String passwd = "123456"; // 连接池初始化大小
static int initialSize = 5; // 连接池最小空闲
static int minPoolSize = 10; // 连接池最大连接数量
static int maxPoolSize = 50; // 最小逐出时间,100秒
static int maxIdleTime = 100000; // 连接失败重试次数
static int retryAttempts = 10; // 当连接池连接耗尽时获取连接数
static int acquireIncrement = 5; // c3p0数据源
static ComboPooledDataSource c3p0DataSource = getC3p0DataSource(); // Druid数据源
static DruidDataSource druidDataSource = getDruidDataSource(); // Proxool数据源
static ProxoolDataSource proxoolDataSource = getProxoolDataSource(); // Tomcat Jdbc Pool数据源
static DataSource tomcatDataSource = getTomcatDataSource(); /**
* 测试方式: 每种数据源配置信息尽量相同,以求结果更加准确
* 每种数据源做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();
// 查询次数
int count = 10;
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 测试结束==========================");
System.out.println();
System.out.println("==========================Proxool 测试开始==========================");
// 测试Proxool
for (int i = 0; i < 100; i++) {
queryProxxool(testDAO, proxoolDataSource, count);
}
System.out.println("==========================Proxool 测试结束==========================");
System.out.println();
System.out.println("==========================Druid 测试开始==========================");
// 测试Druid
for (int i = 0; i < 100; i++) {
queryDruid(testDAO, druidDataSource, count);
}
System.out.println("==========================Druid 测试结束==========================");
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 测试结束==========================");
} /**
* c3p0测试
* @param testDAO
* @param ds
* @param count
* @throws SQLException
*/
public static void queryC3p0(TestDAO testDAO, ComboPooledDataSource ds, int count) throws SQLException {
// 查询10次以初始化连接池
for (int i = 0; i < 10; 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);
} /**
* Proxxool测试
* @param testDAO
* @param ds
* @param count
* @throws SQLException
*/
public static void queryProxxool(TestDAO testDAO, ProxoolDataSource ds, int count) throws SQLException {
// 查询10次以初始化连接池
for (int i = 0; i < 10; 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测试
* @param testDAO
* @param ds
* @param count
* @throws SQLException
*/
public static void queryDruid(TestDAO testDAO, DruidDataSource ds, int count) throws SQLException {
// 查询10次以初始化连接池
for (int i = 0; i < 10; 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);
} /**
* Tomcat Jdbc Pool测试
* @param testDAO
* @param ds
* @param count
* @throws SQLException
*/
public static void queryTomcatJDBC(TestDAO testDAO, DataSource ds, int count) throws SQLException {
// 查询10次以初始化连接池
for (int i = 0; i < 10; 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;
} /**
* 获取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;
} /**
* 获取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;
} /**
* 获取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 36.29
Proxool 41.46
Druid 32.83
Tomcat Jdbc Pool 32.91

评论:

但从时间来看Druid >Tomcat Jdbc Pool >c3p0 >Proxool,在测试的最后Proxool出现了一次异常导致前面较好的波动曲线大幅震荡。 
        只做简单的10次查询数据库时从图中观察到稳定性较好的是c3p0 ,他没有出现较高峰值的情况,虽然平均用时并不是最短的。

        2.测试次数为100次时:


  

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

c3p0 342.73
Proxool 344.65
Druid 317.15
Tomcat Jdbc Pool 293.23

评论:

这里单单从图表中就会很清晰的发现Tomcat Jdbc Pool的性能稳定且耗时最短。Druid与Proxool依旧出现不稳定的情况。

        3.测试次数为500次时:

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

c3p0 1420.67
Proxool 1551.69
Druid 1519.61
Tomcat Jdbc Pool 1491.88

        评论:

此次测试结果比较意外Tomcat Jdbc Pool出现了一次大幅度的波动,Proxool依旧不稳定。在500次查询过程中c3p0表现出来非常好的稳定性及性能。

        4.测试次数为1000次时:
 

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

c3p0  3530.26
Proxool  3140.97
Druid  3090.06
Tomcat Jdbc Pool  3164.57

连接池c3p0 ,Proxool ,Druid ,Tomcat Jdbc Pool对比测试的更多相关文章

  1. SpringBoot2 集成三种连接池 c3p0 hikari druid

    Hikari 1.首先集成 hikari springboot默认集成,只需要简单的配置即可 1.1 首先导入包 <dependency> <groupId>com.zaxxe ...

  2. DBCP,C3P0与Tomcat jdbc pool 连接池的比较

    hibernate开发组推荐使用c3p0; spring开发组推荐使用dbcp(dbcp连接池有weblogic连接池同样的问题,就是强行关闭连接或数据库重启后,无法reconnect,告诉连接被重置 ...

  3. c3p0、dbcp、tomcat jdbc pool 连接池配置简介及常用数据库的driverClass和驱动包

    [-] DBCP连接池配置 dbcp jar包 c3p0连接池配置 c3p0 jar包 jdbc-pool连接池配置 jdbc-pool jar包 常用数据库的driverClass和jdbcUrl ...

  4. 使用 Tomcat 7 新的连接池 —— Tomcat jdbc pool

    Tomcat 在 7.0 以前的版本都是使用 commons-dbcp 做为连接池的实现,但是 dbcp 饱受诟病,原因有: dbcp 是单线程的,为了保证线程安全会锁整个连接池 dbcp 性能不佳 ...

  5. Tomcat7 新的数据库连接池Tomcat jdbc pool介绍和配置

    Tomcat 在 7.0 以前的版本都是使用commons-dbcp做为连接池的实现,但是 dbcp存在一些问题: (1)dbcp 是单线程的,为了保证线程安全会锁整个连接池 (2)dbcp 性能不佳 ...

  6. 网络协议 finally{ return问题 注入问题 jdbc注册驱动问题 PreparedStatement 连接池目的 1.2.1DBCP连接池 C3P0连接池 MYSQL两种方式进行实物管理 JDBC事务 DBUtils事务 ThreadLocal 事务特性 并发访问 隔离级别

    1.1.1 API详解:注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 原因有2个: >导致驱动被注册2 ...

  7. spring配置tomcat jdbc pool数据库连接池

    <bean id="sqliteDataSource" class="org.apache.tomcat.jdbc.pool.DataSource" de ...

  8. JDBC连接池C3P0

    连接池 1)传统方式找DriverManager要连接.数目是有限的. 2)传统方式的close().并没有将Connection重用.仅仅是切断应用程序和数据库的桥梁,即无发送到SQL命令到数据库端 ...

  9. JDBC连接池-C3P0连接

    JDBC连接池-C3P0连接 c3p0连接池的学习英语好的看英文原版      c3p0 - JDBC3 Connection and Statement Pooling 使用c3p0连接池  三种方 ...

随机推荐

  1. Docker----起步(2)----在Ubuntu上安装最新版的Docker CE

    之前写了一篇文章关于Docker安装的博客,最近再次使用的时候,在docker的官方文档上发现最新版本的Docker(V18.03)的安装方式和之前有点区别,有一些命令发现不能用了.(真的是一天不学习 ...

  2. .net core ef 通过dbfirst方式连接mysql数据库

    1. 创建基于.net core的项目(过程略) 2. 利用nuget添加以下引用 MySql.Data.EntityFrameworkCore         Pomelo.EntityFramew ...

  3. js获取当前时间并实时刷新

    效果如图: 代码如下: <html> <head> <title>js获取当前时间并实时刷新</title> <script> //页面加载 ...

  4. Python之copy模块

    概念 官方解释:Python中的赋值语句不复制对象,它们在目标和对象之间建立索引.对于可变项目或可变项目的集合,有时需要一个副本,以便可以更改一个副本而不更改其他副本.该模块提供通用的浅层和深层cop ...

  5. PHP字符过滤方法

    function str_filter_replace($str) { if (empty($str)) return false; $str = htmlspecialchars($str); $s ...

  6. Linux ☞ Good good study,day day up

    一. 修改桌面程序图标 linux的桌面图标都是在/usr/share/applications 目录下的那些 *.desktop文件,修改桌面程序图标就是修改.desktop图标配置文件中Icon的 ...

  7. UOJ#373. 【ZJOI2018】线图 搜索,树哈希,动态规划

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ373.html 前言 真是一道毒瘤题.UOJ卡常毒瘤++.我卡了1.5h的常数才过QAQ Orzjry 标算居然是指数做法 ...

  8. python常见的函数和类方法

    在学python编程时 常常会遇到些常见的函数 记录学习 1. getattr函数 """ getattr() 函数用于返回一个对象属性值. 语法: getattr(ob ...

  9. Vue-Router嵌套路由

    1:查看router-view所对应的位置,是属于顶级出口还是存在于某个组件当中 2:当router-view存在于某个组件当中时 const User = { template: ` <div ...

  10. 数据库和Content Provider

    SQLite提供了强大的SQL数据库的库文件,从而使应用程序拥有一个具备完全控制权的健壮的持久化层. Content Provider实现在应用程序内和应用程序之间存储.共享和使用结构化数据.通过将数 ...