文章目录
JDBC -(04)Druid连接池技术
1. 连接性能消耗问题
//释放资源
connection.close();
我们向数据库发送一次请求,获取数据库连接connection,当向数据库发送sql语句并获取到返回结果之后,connection就被销毁掉了,这样不仅占用服务资源而且效率也会非常的慢,connection其实是可以复用的。
2. 数据库连接池的作用
2.1 不使用数据库连接池
- 不使用数据库连接池,每次都通过DriverManager获取新的连接,用完直接抛弃,这样对资源的利用率太低。
- 对应数据库服务器来说,压力太大。数据库服务器和Java程序对连接数也无法控制,很容易导致数据库服务器崩溃。
2.2 使用数据库连接池
- 我们可以建立一个连接池,这个池中可以容纳一定数量的连接对象,一开始,我们可以先替用户创建好一些连接对象,等用户要拿连接对象时,就直接从池中获取,不用新建了,这样可以节省时间等用户用完之后,放回去,别人可以接着用。
- 可以提高连接的使用率,当池中的现有连接都用完了,那么连接池可以向服务器申请新的连接池放到池中。
- 直到池中的连接达到最大连接数,就不能再申请新的连接了。如果没有拿到连接的用户只能等待。
3.常用的连接池产品
JDBC的数据库连接池使用 javax.sql.DataSource 接口进行规范,所有的第三方连接池都实现此接口,自行添加具体实现。也就是说,所有连接池获取连接和回收连接方法都一样,不同的只有性能和拓展功能。
常见的连接池产品:
- DBCP:Apache提供的数据库连接池,速度相对c3p0较快,但因自身存在bug
- C3P0:速度相对较慢,稳定性还可以
- Proxoool:开源项目数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点
- Druid:阿里提供的数据库连接池,性能稳定,有监控功能。
4.Druid连接池使用
4.1 导入Druid工具类jar
4.2 创建Druid连接池
创建Druid连接池有两种方式:
- 硬编码方式(不推荐)
- 软编码方式
4.2.1 硬编码方式
创建步骤:
1.创建一个druid连接池对象
2.设置连接池参数【必须 |非 必须】
3.获取连接【通用方法,所有连接池都一样】
4.回收连接【通用方法,所有连接池都一样】
创建Druid连接池对象,核心参数设置:
- 必须参数:账号、密码、url、driverClass
- 非必须参数:初始化个数、最大连接数量
应用举例:
package com.julissa.api.druid;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
import org.junit.jupiter.api.Test;
import java.sql.SQLException;
public class DruidUse {
@Test
public void testHard() throws SQLException {
//1.创建连接池对象
DruidDataSource dataSource = new DruidDataSource();
//2.设置连接参数(四个必须参数)
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://127.0.0.1: 3306/julissa");
dataSource.setUsername("root");
dataSource.setPassword("123456");
//3.获取连接
DruidPooledConnection connection = dataSource.getConnection();
System.out.println(connection);
//数据库crud
//4.回收连接
connection.close();
}
}
4.2.2 软编码方式
不直接再Java代码中编写配置信息
利用工厂模式,传入配置文件对象,创建连接池
创建步骤:
1.创建外部配置文件(src/druid.properties)
2.读取外部配置文件
3.通过Druid工具类的工厂模式创建连接池
4.获取连接
5.回收连接
应用举例:
外部配置文件
# Druid连接池配置参数,key固定命名
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/julissa
username=root
password=123456
@Test
public void testSoft() throws Exception {
//1.读取外部配置文件 Properties
Properties properties = new Properties();
//src下的文件,可以使用类加载器提供的方法
InputStream resourceAsStream = DruidUse.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(resourceAsStream);
//2.使用连接池的工具类的工厂模式,创建连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//3.获取连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
//4.数据库crud
//5.回收连接
connection.close();
}
``