介绍
数据库连接是一项非常关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。
记得之前做的一个项目,当时的应用程序配置的c3p0数据库连接池,最大允许的连接数是500,结果上线没多久,并发量直接上来了,导致大量的数据插入失败,当晚的心情可想而知~
从那一次事故之后,让我对应用程序的数据库连接数有了一次深刻的认识,为了防止再次栽跟头,特意抽了一个时间来编写程序测试案例,用于测试各个数据源连接池的稳定性,以防止自己再次踩坑!
话不多说,直接撸起来!
二、程序实例
熟悉 web 系统开发的同学,基本都知道,在 Java 生态中开源的常用数据库连接池有以下几种:
- dbcp:DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池,DBCP可以直接的在应用程序中使用,Tomcat的数据源使用的就是DBCP
- c3p0:c3p0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection和Statement池的DataSources对象
- druid:阿里出品,淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。
今天我们就一起来对比一下,这三种数据源连接池的稳定性。
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配置文件。
username=root
password=Hello@123456
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://192.168.31.200:3306/testdb?useUnicode=true&characterEncoding=UTF-8
initialSize=5
maxActive=1000
maxIdle=5
removeAbandoned=ture
removeAbandonedTimeout=20
logAbandoned=true
maxWait=100
接着,创建一个连接池工具DbcpJdbcUtil。
public class DbcpJdbcUtil {
private static final Logger logger = LoggerFactory.getLogger(DbcpJdbcUtil.class);
/**jdbc配置文件*/
private static Properties prop = new Properties();
private static BasicDataSource dataSource = null;
// 它是事务专用连接!
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
static {
classPathSourceRead();
}
private static void classPathSourceRead(){