数据库连接池的由来
我们在使用JDBC的时候,每次都创建和数据库的连接,然后释放这个资源。我们在创建连接的时候,是从系统底层获取和数据库的连接,非常的消耗资源,如果我们频繁创建连接,然后释放连接,这样效率低下,所以我们由此引入了数据库连接池,来解决这种问题
一、概念
数据库连接池其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器
二、优点
- 节约资源
- 用户访问高效
三、实现
- 数据库连接池其实是一个标准接口:DataSource位于javax.sql包下
① 有获取连接的方法:getConnection()
获取连接的方法
② 还有归还连接的方法:如果连接对象Conncetion是从连接池中获取的,那么直接调用Connection.close
方法即可,但是这里不是关闭连接,而是归还连接 - 一般我们不去实现它,有数据库厂商来实现它
① C3P0:数据库连接池技术
② Druid:数据库连接池技术,由阿里巴巴提供
四、C3P0数据库连接池
1、使用步骤
(1)导入jar包(两个)
c3p0-版本.jar和mchange-commons-java-版本.jar
(2)定义配置文件:
① c3p0.properties 或者c3p0-config.xml必须叫这两名字,只有叫这两个名字,他才能自己找到
② 路径:直接将文件放在src目录下即可
(3)加载配置文件
通过properties获取
(4)创建数据库连接池对象
创建ComboPooledDataSource对象
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
如果传递参数的话,会使用指定参数的配置文件,如果不传递参数的话使用默认的配置文件
(5)获取连接
使用getConnectioin方法获取连接
Connection conn = comboPooledDataSource.getConnection();
举例示范
注意
- 总共导入三个jar包
- close方法不是关闭数据库连接,而是归还连接给数据库连接池
五、Druid
1、实现步骤:
(1)导入jar包
druid-版本号.jar和mysql的jar包
(2)定义配置文件:
是properties形式的,可以叫做任意名称,放在任意目录下
(3)获取数据库连接池对象:
通过工厂类DruidDataSourceFactory来获取DataSource
(4)获取连接
通过getConnection方法获取连接
举例示范
得到结果,成功获取连接对象
配置文件信息
六、druid工具类
1、定义一个类叫做JDBCUtils
2、提供静态代码块加载配置文件,初始化连接池对象
3、提供方法
① 获取连接方法:通过数据库连接池连接
② 释放资源
③ 获取连接池的方法
举例示范:
package util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
public class JDBCUtils2 {
private static DataSource ds;
static {
try {
// 通过Properties这个类中的load()方法来加载配置文件
Properties pro = new Properties();//先创建Properties对象 pro.load(JDBCUtils2.class.getClassLoader().getResourceAsStream("druid.properties"));
// 通过德鲁伊数据资源工厂类来调用creatDataSource()方法,传递进去Properties类型的集合获取DataSource数据库连接池对象
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接的方法
* @return 返回一个连接对象
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
public static void close(Statement stmt,Connection conn){
close(null,stmt,conn);
}
public static void close(ResultSet rs,Statement stmt, Connection conn){
if (rs != null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (stmt != null){
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null){
try {
conn.close();//注意这里是归还连接,而不是关闭连接
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}