为什么使用连接池?
连接数据库使用的TCP协议,每次连接需要进行"三次握手"非常耗时,所以产生了连接池需求。
- 程序一开始就创建一定数量的连接,放在一个容器中,这个容器称为连接池(相当于碗柜/容器)。
- 使用的时候直接从连接池中取一个已经创建好的连接对象。
关闭的时候不是真正关闭连接,而是将连接对象再次放回到连接池中。
连接池使用:
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。(eg:需遵循统一的规则,这样应用程序可以方便的切换不同厂商的连接池!)
常见的第三方连接池:
- C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0是异步操作的,所以一些操作时间过长的JDBC通过其它的辅助线程完成。目前使用它的开源项目有Hibernate,Spring等。C3P0有自动回收空闲连接功能
- 阿里巴巴-德鲁伊druid连接池:Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成。该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求。
- DBCP(DataBase Connection Pool)数据库连接池,是Apache上的一个Java连接池项目,也是Tomcat使用的连接池组件。dbcp没有自动回收空闲连接的功能。
使用步骤:
1. C3P0连接池使用
- 导入jar包 (两个)c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
- 拷贝配置文件到src目录
- 创建连接池(配置文件自动读取的)
- 编写配置文件 c3p0-config.xml
最后数据库本身的驱动jar包不要忘记了,这里用的是mysql-connector-java-5.1.37-bin.jar
<c3p0-config> <!-- 使用默认的配置读取连接池对象 --> <default-config> <!-- 连接参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/day19</property> <property name="user">root</property> <property name="password">root</property> <!-- 连接池参数 --> <property name="initialPoolSize">5</property> </default-config> </c3p0-config>
c3p0连接池常用的配置参数:
参数 | 说明 |
---|---|
initialPoolSize | 初始连接数 |
maxPoolSize | 最大连接数 |
checkoutTimeout | 最大等待时间 |
maxIdleTime | 最大空闲回收时间 |
- 编写Java代码
/**
* C3P0连接池的工具类
*
*/
public class C3P0Utils {
//1. 创建一个C3P0的连接池对象(会自动读取src目录下的c3p0-config.xml,所以不需要我们解析配置文件)
public static DataSource ds = new ComboPooledDataSource();
//2. 提供 从连接池中 获取连接对象的方法
public static Connection getConnection() throws SQLException {
Connection conn = ds.getConnection();
return conn;
}
//3. 提供 获得数据源(连接池对象)的方法
public static DataSource getDataSource(){
return ds;
}
}
2. Druid连接池使用
Druid的下载地址:https://github.com/alibaba/druid
DRUID连接池使用的jar包:`druid-1.1.16.jar
步骤:
- 导入DRUID jar 包
- 拷贝配置文件到src目录
- 根据配置文件 创建连接池对象
- 从连接池对象获得连接
- 编写配置文件druid.properties, 放在src目录下
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day19
username=root
password=root
- 编写Java代码
/**
* 阿里巴巴的连接池 Druid 工具类
*/
public class DruidUtils {
/*
1. 加载 druid.properties 配置文件
2. 创建 Druid 连接池对象
3. 提供 获得 连接池对象的方法
4. 提供 从连接池中 获取连接对象Connection的 方法
*/
public static DataSource ds = null;
static {
try {
//1. 加载 druid.properties 配置文件
InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");
Properties prop = new Properties();
prop.load(is);
//2. 创建 Druid 连接池对象
ds = DruidDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
/*
3. 提供 获得 连接池对象的方法
*/
public static DataSource getDataSource(){
return ds;
}
/*
4. 提供 从连接池中 获取连接对象Connection的 方法
*/
public static Connection getConnetion() throws SQLException {
Connection conn = ds.getConnection();
return conn;
}
}
评论 (0)