为什么说Druid是目前最好的数据库连接池?

网友投稿 613 2023-06-15

为什么说Druid是目前最好的数据库连接池?

为什么说Druid是目前最好的数据库连接池?

一、介绍

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

记得之前做的一个项目,当时的应用程序配置的数据库连接池,最大允许的连接数是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、***-12、postgresql-9.6。

3.1、插入10万条数据

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

测试dbcp执行结果

测试c3p0执行结果

测试druid执行结果

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

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

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

3.2、插入100万条数据

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

测试dbcp执行结果

测试c3p0执行结果

测试druid执行结果

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

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

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

四、小结

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

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

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SQL数据库类似正则表达式的字符处理问题
下一篇:细数 Mycat 中的那些坑
相关文章