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

[经验分享] 连接池c3p0 ,Proxool ,Druid ,Tomcat Jdbc Pool对比测试

[复制链接]

尚未签到

发表于 2017-2-5 11:17:29 | 显示全部楼层 |阅读模式
  这次所要做的测试是比较几种我们常用的数据库连接池的性能,他们分别是: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次时:
  
DSC0000.png

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

c3p032.26
Proxool33.42
Druid30.43
Tomcat Jdbc Pool37.61
  2.测试次数为100次时:
  
DSC0001.png

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

c3p0409.94
Proxool447.49
Druid382.7
Tomcat Jdbc Pool386.3
  3.测试次数为500次时:

DSC0002.png

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

c3p01700.95
Proxool2053.85
Druid1777.36
Tomcat Jdbc Pool1749.02
  4.测试次数为1000次时:
  
DSC0003.png

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

c3p0 3549.29
Proxool 3435.8
Druid 3167.59
Tomcat Jdbc Pool 3162.25
  因为测试耗时很长,所以我只做到了1000次查询测试,感兴趣的朋友可以继续更大规模的测试或修改相应参数来符合项目自身情况,这里不比去追究测试数据的准确性,比较测试程度还不够,且存在很大的偶然性,大家可以修改以上代码进行更精准的测试,只需要将数据导入到本文末尾的excel表格中即可生成相应测试图表。
  很多人总是会回复在问“你的测试准不准啊?”,“你的测试一点都不准!”等等,其实我想说的是:不要太在意别人的结果,重要的是自己去做!

运维网声明 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-337746-1-1.html 上篇帖子: DBCP,C3P0,Tomcat_JDBC druidDatasource 性能及稳定性测试 下篇帖子: Resin和Tomcat的JNDI数据连接池配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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