Druid数据库连接池的用法(附带实例)
Java 程序中通过 JDBC 进行数据库的增删改查,每次连接数据库都需要通过 DriverManager 获取新连接,而且用完就要抛弃断开释放资源。
这样一来,连接的利用率较低,浪费比较严重。对于数据库服务器来说压力较大,数据库服务器和 Java 程序对连接数无法控制,很容易导致数据库服务器崩溃。
本节所讲的数据库连接池是数据库连接对象的缓冲区,负责申请、分配管理,以及释放连接的操作。
首先,建立一个连接池,这个池中能容纳一定数量的连接对象。一开始,我们可以先替用户创建一些连接对象。当用户需要使用连接对象时就直接从池中获取,无须重新建立连接,这样也可以节省时间。用户使用完,再把连接对象放回连接池中,下次别人还可以接着使用。这样一来大大提高了连接的使用率。
如果当连接池中的现有连接对象都用完了,那么连接池可以向服务器申请新的连接对象放到池中,直到池中的连接数量达到“最大连接数”就不能再申请了。这时,如果有用户来获取池中的连接对象,没有拿到连接只能等待。
JDBC 的数据库连接池使用“javax.sql.DataSource”来表示,DataSource 只是一个接口,通常被称为数据源。该接口通常由服务器(如 Weblogic、WebSphere、Tomcat)提供实现,也有一些开源组织提供实现,例如 DBCP、C3P0、BoneCP、Druid 等:
下面对 Druid 数据库连接池的具体使用展开介绍。Druid 数据库连接池的使用很简单,具体步骤如下:
例如,在 chapter07_JdbcTest 项目中,引入 Druid 的依赖包,并创建 druid.properties 文件设置数据库信息。目录结构如下图所示:

图 1 目录结构
druid.properties 文件的示例代码如下:
创建 TestPool 类,编写代码实现从数据库连接池中获取数据库连接对象,示例代码如下:
运行代码后测试连接,查看控制台,如下图所示:

图 2 从数据库连接池获取连接对象
从图中可知,成功通过 Druid 数据库连接池获取连接对象。
这样一来,连接的利用率较低,浪费比较严重。对于数据库服务器来说压力较大,数据库服务器和 Java 程序对连接数无法控制,很容易导致数据库服务器崩溃。
本节所讲的数据库连接池是数据库连接对象的缓冲区,负责申请、分配管理,以及释放连接的操作。
首先,建立一个连接池,这个池中能容纳一定数量的连接对象。一开始,我们可以先替用户创建一些连接对象。当用户需要使用连接对象时就直接从池中获取,无须重新建立连接,这样也可以节省时间。用户使用完,再把连接对象放回连接池中,下次别人还可以接着使用。这样一来大大提高了连接的使用率。
如果当连接池中的现有连接对象都用完了,那么连接池可以向服务器申请新的连接对象放到池中,直到池中的连接数量达到“最大连接数”就不能再申请了。这时,如果有用户来获取池中的连接对象,没有拿到连接只能等待。
JDBC 的数据库连接池使用“javax.sql.DataSource”来表示,DataSource 只是一个接口,通常被称为数据源。该接口通常由服务器(如 Weblogic、WebSphere、Tomcat)提供实现,也有一些开源组织提供实现,例如 DBCP、C3P0、BoneCP、Druid 等:
- DBCP:Apache 提供的数据库连接池,速度相对 C3P0 较快,但因自身存在 BUG,Hibernate3 已不再提供支持;
- C3P0:一个开源组织提供的数据库连接池,速度相对较慢,稳定性还可以;
- Proxool:sourceforge 下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较 C3P0 差一点;
- BoneCP:一个开源组织提供的数据库连接池,速度快;
- Druid:阿里提供的数据库连接池,据说是集 DBCP、C3P0、Proxool 优点于一身的数据库连接池,也是本节介绍并使用的数据库连接池。
下面对 Druid 数据库连接池的具体使用展开介绍。Druid 数据库连接池的使用很简单,具体步骤如下:
- 在项目中引入 Druid 的依赖包“druid-1.0.9.jar”,创建数据库连接池对象。
- 设置数据库的相关信息,该信息通常存储在一个单独的配置文件中,如 druid.properties。
- 通过编写代码,实现从数据库连接池中获取数据库连接对象即可。
例如,在 chapter07_JdbcTest 项目中,引入 Druid 的依赖包,并创建 druid.properties 文件设置数据库信息。目录结构如下图所示:

图 1 目录结构
druid.properties 文件的示例代码如下:
driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/atguigu username=root password=root
创建 TestPool 类,编写代码实现从数据库连接池中获取数据库连接对象,示例代码如下:
- package com.atguigu.pool;
- //省略 import 语句
- public class TestPool {
- public static void main(String[] args) throws Exception {
- Properties pro = new Properties(); //这是一个 map
- //由于druid.properties文件存放在src目录下,最后会随着.java文件一起编译到类路径下(class)
- //通过类加载器加载资源配置文件
- pro.load(TestPool.class.getClassLoader().getResourceAsStream("druid.properties"));
- DataSource ds = DruidDataSourceFactory.createDataSource(pro);
- Connection connection = ds.getConnection();
- System.out.println("connection = " + connection);
- }
- }

图 2 从数据库连接池获取连接对象
从图中可知,成功通过 Druid 数据库连接池获取连接对象。