在项目中使用C3P0作为数据库连接池,被技术总监怼了

网友投稿 496 2023-04-03

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

在项目中使用C3P0作为数据库连接池,被技术总监怼了

一、介绍

数据库连接是一项非常关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。

记得之前做的一个项目,当时的应用程序配置的c3p0数据库连接池,最大允许的连接数是500,结果上线没多久,并发量直接上来了,导致大量的数据插入失败,当晚的心情可想而知~

从那一次事故之后,让我对应用程序的数据库连接数有了一次深刻的认识,为了防止再次栽跟头,特意抽了一个时间来编写程序测试案例,用于测试各个数据源连接池的稳定性,以防止自己再次踩坑!

话不多说,直接撸起来!

二、程序实例

熟悉 web 系统开发的同学,基本都知道,在 Java 生态中开源的常用数据库连接池有以下几种:

今天我们就一起来对比一下,这三种数据源连接池的稳定性。

2.1、创建测试表

下面以 mysql 数据库为例,首先创建一个t_test表,方面后续进行插入数据操作。

CREATE TABLE t_test (   id bigint(20) unsigned NOT NULL COMMENT '主键ID',   name varchar(32) NOT NULL COMMENT '名称',   PRIMARY KEY (id) ) ENGINE=InnoDB COMMENT='测试表';

2.2、 编写测试用例

以dbcp为例,首先创建一个dbcp-jdbc.properties配置文件。

接着,创建一个连接池工具DbcpJdbcUtil。

最后,编写单元测试程序DBCPTest。

public class DBCPTest {    private static final int sumCount = 1000000;    private static final int threadNum = 600;    private void before(String path) {   SysConstants.putValue(path);   new DBCPService().insert("delete from t_test");  }    @Test  public void testMysql() {   long start = System.currentTimeMillis();   String path = "config/mysql/dbcp-jdbc.properties";   before(path);   for (int i =0; i < 1; i++) {    String sql = "insert into t_test(id,name) values('" +i+ "','dbcp-mysql-" + i + "')";    new DBCPService().insert(sql);   }   System.out.println("耗时:" + (System.currentTimeMillis() - start));  }    @Test  public void testThreadMysql() throws InterruptedException {   String path = "config/mysql/dbcp-jdbc.properties";   before(path);   BlockingQueue queue = new LinkedBlockingQueue();   for (int i = 0; i < sumCount; i++) {    String sql = "insert into t_test(id,name) values('" +i+ "','dbcp-mysql-" + i + "')";    queue.put(sql);   }   long start = System.currentTimeMillis();   final CountDownLatch countDownLatch = new CountDownLatch(threadNum);   for (int i = 0; i < threadNum; i++) {    final int finalI = i + 1;    new Thread(new Runnable() {     @Override     public void run() {      System.out.println("thread " + finalI + " start");      boolean isGo = true;      while (isGo) {       String sql = queue.poll();       if(sql != null) {        new DBCPService().insert(sql);       }else {        isGo =false;        System.out.println("thread " + finalI + " finish");        countDownLatch.countDown();       }      }     }    }).start();   }   countDownLatch.await();    System.out.println("耗时:" + (System.currentTimeMillis() - start));  }  }

c3p0、druid的配置也类似,这里就不在重复介绍了!

三、性能测试

程序编写完成之后,下面我们就一起来结合各种不同的场景来测试一下各个数据连接池的表现。

为了进一步扩大测试范围,本次测试还将各个主流的数据库也拉入进去,测试的数据库分别是:mysql-5.7、oracle-12、postgresql-9.6

3.1、插入10万条数据

首先,我们来测试一下,各个数据库插入10万条数据,采用不同的数据源连接池,看看它们的表现如何?

测试dbcp执行结果

测试c3p0执行结果

测试druid执行结果

从上面测试结果,我们可以基本得出如下结论:

从数据连接池性能角度看:dbcp >= druid > c3p0从数据库性能角度看:oracle > postgresql > mysql

其中druid对postgresql的支持性能最好,c3p0的表现比较差!

3.2、插入100万条数据

可能有的同学,还不太认可,下面我们就来测试一下插入100万条,看看它们的表现如何?

测试dbcp执行结果

测试c3p0执行结果

测试druid执行结果

从上面测试结果,我们可以基本得出如下结论:

从数据连接池性能角度看:druid性能比较稳定,dbcp、c3p0都有某种程度的执行失败从数据库性能角度看:postgresql > oracle > mysql

还是一样的结论,druid对postgresql的支持性能最好,c3p0的表现比较差!

四、小结

从上面的测试结果,我们可以很清晰的看到,在数据连接池方面,druid和dbcp旗鼓相当,而并发方面druid的稳定性大于dbcp,c3p0相比druid和dbcp,稳定性和执行速度要弱些。

在数据库方面,postgresql速度要优于oracle,而oracle对各个数据源的支持和稳定性要有优势,mysql相比oracle和postgresql,执行速度要弱些。

如果在实际开发中,数据源连接池推荐采用druid,数据库的选用方面 postgresql > oracle > mysql。

上一篇:用 NetworkManager 配置 wireguard 虚拟私有网络
下一篇:数据库环境标准化管理的初步规划
相关文章

 发表评论

暂时没有评论,来抢沙发吧~