今天主要学习C3P0/DBCP/Druid连接池
思维导图:
一.DBCP连接池
1.数据库的连接池在建立数据库连接的时候,能解决很多问题,提高性能的优化。同时市面也有很多第三方公司也为java提供了对应的连接池。所有三方公司的连接池也和JDBC一样,需要遵守一个规则(接口):javax.sql.DataSource;
2.各个厂商如果要兼容市面的业务代码一般都会去实现这个接口,以便于各个连接池之间相互切换以及兼容。
3.现在市面上常见的连接池:DBCP(Spring推荐)/C3P0(Hibernate)/Druid(阿里开源)
4.DBCP连接池:Apache推出的Database Connection Pool
5.使用的步骤:
(1)导入jar包(因为不是java自带的,所以需要导入三方包)
commons-dbcp-1.4.jar -- 核心包
commons-pool-1.5.6.jar -- 辅助包
(2)创建连接池对象
方式1:Ba2sicDataSource ds = new BasicDataSource();
方式2:DataSource ds = new BasicDataSource();
(3)设置基础的连接参数
//url地址
ds.setUrl("jdbc:mysql://115.28.67.10:3306/jdbc_demo?characterEncoding=utf-8");
//账号
ds.setUsername("seehope_demo");
//密码
ds.setPassword("test");
//驱动
ds.setDriverClassName("com.mysql.jdbc.Driver");
(4)设置连接池的附加参数(非必须)
//初始化的连接数
ds.setInitialSize(5);
//最大的连接数
ds.setMaxActive(10);
//超时时间(毫秒)
ds.setMaxWait(3000);
//空闲时间
ds.setMaxIdle(3000);
(5)获取连接
Connection connection = ds.getConnection();
(6)释放连接(注意,释放连接请使用connection来操作,因为代理模式会转向到BasicDataSource进行处理,这里的close不再是关闭连接,而是将连接重新释放到连接池)
connection.close();
例子:
package com.dbcp;
import org.apache.commons.dbcp.BasicDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class DbcpDemo01 {
public static void main(String[] args) throws SQLException {
//1.创建连接池对象
BasicDataSource ds = new BasicDataSource();
//通过多态多方式(证明BasicDataSource确实是实现了DataSource)
//DataSource ds2 = new BasicDataSource();
//2.设置连接参数
//url地址
ds.setUrl("jdbc:mysql://115.28.67.10:3306/jdbc_demo?characterEncoding=utf-8");
//账号
ds.setUsername("seehope_demo");
//密码
ds.setPassword("test");
//驱动
ds.setDriverClassName("com.mysql.jdbc.Driver");
//3.设置连接池的附加参数
//初始化的连接数
ds.setInitialSize(5);
//最大的连接数
ds.setMaxActive(10);
//超时时间(毫秒)
ds.setMaxWait(3000);
//空闲时间
ds.setMaxIdle(3000);
//4.获取连接
//这里其实使用了一个代理模式来代理了Connection,所以显示的方式有所不同。
// Connection connection = ds.getConnection();
// System.out.println(connection);
//模拟测试多个连接
for (int i = 0; i < 11; i++) {
Connection connection = ds.getConnection();
System.out.println(connection);
if(i == 2){
connection.close();
}
}
}
}
二.Druid连接池
1.Druid(德鲁伊),是阿里巴巴自己开源的一个数据库连接池,他结合了C3P0/DBCP等数据库连接池的优点;同时还在自己的连接池上新增了日志监控和性能监控,可以非常好的去监控连接池和SQL代码的执行情况
2.可以说Druid是针对监控和性能而生的,也可以说,Druid是目前性能最好、功能最全的一个数据库连接池。
3.Druid的操作和变量名跟DBCP完全一致,只不过在创建连接池对象的时候,使用的是Druid的对象就可以,其余的不需要做任何的改变。
4.在Druid连接池配置中,driverClassName可配可不配,不配置的话可以根据url自动识别数据库类型,然后选择相应的driverClassName。
5.在三个数据库的连接池当中,DBCP的性能最低,但是功能完善,而08的性能较高,但是部分功能缺失(影响不大),Druid是性能最强,功能最全的数据库连接池。
例子:
package com.druid;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.dbcp.DbcpDemo02;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.util.Properties;
public class DruidDemo01 {
public static void main(String[] args) throws Exception {
//1.创建连接池对象
DruidDataSource ds = new DruidDataSource();
//通过多态多方式(证明BasicDataSource确实是实现了DataSource)
//DataSource ds2 = new BasicDataSource();
//2.设置连接参数
//url地址
ds.setUrl("jdbc:mysql://115.28.67.10:3306/jdbc_demo?characterEncoding=utf-8");
//账号
ds.setUsername("seehope_demo");
//密码
ds.setPassword("test");
//驱动
ds.setDriverClassName("com.mysql.jdbc.Driver");//可以选择不配置,自动根据url进行识别
//3.设置连接池的附加参数
//初始化的连接数
ds.setInitialSize(5);
//最大的连接数
ds.setMaxActive(10);
//超时时间(毫秒)
ds.setMaxWait(3000);
//空闲时间
ds.setMaxIdle(3000);
//4.获取连接
//这里其实使用了一个代理模式来代理了Connection,所以显示的方式有所不同。
// Connection connection = ds.getConnection();
// System.out.println(connection);
//模拟测试多个连接
for (int i = 0; i < 11; i++) {
Connection connection = ds.getConnection();
System.out.println(connection);
if(i == 2){
connection.close();
}
}
}
public static void test() throws Exception {
//创建一个配置文件对象
Properties ps = new Properties();
//加载配置文件到内存(当文件位置在项目根目录的时候,可以使用相对路径)
//ps.load(new FileInputStream("dbcp.properties"));
//通过类加载器来加载配置文件(可以直接读到src目录下,推荐)
ps.load(DruidDemo01.class.getClassLoader().getResourceAsStream("druid.properties"));
//创建加载配置文件的工厂类
DataSource dataSource = DruidDataSourceFactory.createDataSource(ps);
//获取连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
//释放资源
connection.close();
}
}
三.C3P0连接池
1. C3P0是一个开源免费的数据库连接池,其操作和性能和之前学过的DBCP差不多,是Hibernate官方主力和默认使用的数据库连接池。
2.如何使用C3P0?
(1)因为的不是官方的,所以需要导入3方jar包
c3p0-0.9.5.2.jar
mchange-commons-java-0.2.12.jar
(2)创建连接池对象
ComboPooledDataSource ds = new ComboPooledDataSource();
DataSource ds = new ComboPooledDataSource();
(3)给连接池设置连接参数
ds.setUser("seehope_demo");
ds.setPassword("test");
ds.setJdbcUrl("jdbc:mysql://115.28.67.10:3306/jdbc_demo?characterEncoding=utf-8");
ds.setDriverClass("com.mysql.jdbc.Driver");
(4)给连接池设置附加参数
//初始化连接数
ds.setInitialPoolSize(5);
//最大连接数
ds.setMaxPoolSize(10);
//最小连接数
ds.setMinPoolSize(3);
//最大等待时间
ds.setCheckoutTimeout(3000);
(5)获取连接
Connection connection = ds.getConnection();
(6)释放连接到连接池
connection.close();
例子:
package com.c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException;
import java.sql.Connection;
public class C3p0Demo01 {
public static void main(String[] args) throws Exception {
//创建连接池对象
ComboPooledDataSource ds = new ComboPooledDataSource();
//设置连接池的连接参数
ds.setUser("seehope_demo");
ds.setPassword("test");
ds.setJdbcUrl("jdbc:mysql://115.28.67.10:3306/jdbc_demo?characterEncoding=utf-8");
ds.setDriverClass("com.mysql.jdbc.Driver");
//设置连接池附加参数
//初始化连接数
ds.setInitialPoolSize(5);
//最大连接数
ds.setMaxPoolSize(10);
//最小连接数
ds.setMinPoolSize(3);
//最大等待时间
ds.setCheckoutTimeout(3000);
//获取连接
// Connection connection = ds.getConnection();
// System.out.println(connection);
//模拟测试
for (int i = 0; i < 11; i++) {
Connection connection = ds.getConnection();
System.out.println(connection);
if(i == 5){//模拟释放
connection.close();
}
}
//connection.close();//因为使用了代理模式,且重写了close,所以这里的close不是关闭连接,而是将连接释放到连接池
}
}