一、连接池概念

1、概念

连接池是connection对象的缓冲区,他里面会存放一些connection,当程序需要使用connection时,如果连接池中有,则直接从连接池获取,不需要再重新创建connection。连接池让程序能够复用连接。

2、为什么使用连接池

每次创建和销毁连接都会带来较大的系统开销

每次创建和销毁连接都需要时间

可以防止大量用户并发访问数据库服务器

3、连接池优势

资源重用

更快地响应速度

新的资源分配手段

统一的连接管理,避免数据库连接泄露

4、连接池原理

1、连接池维护着两个容器空闲池和活动池

2、空闲池用于存放未使用的连接,活动池存放正在使用的连接,活动池中的连接使用完之后要归还回空闲池

3、当需要连接时,先判断空闲池是否有连接,如果有则取出一个放置到活动池供程序使用

4、如果没有,则判断活动池中连接是否达到最大连接数,如果没有,则创建一个连接放到活动池供程序使用。

5、如果空闲池中没有连接,活动池中连接也达到上限,则不能创建新连接,此时会判断是否等待超时,如果没有等待超时则需等待活动池中的连接归还回空闲池

6、如果等待超时,可以采取多种处理方式,例如:直接抛出异常,或将活动池中使用最久的连接移除掉归还回空闲池以供程序使用

二、连接池实现

1、DataSource接口

JDBC数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,所有java数据库连接池都需要实现该接口。

2、常见数据库连接池

DBCP     C3P0     Proxool     HikariCP     Druid

3、Druid连接池的使用

(1)加入jar包

(2)创建druid连接池的配置文件druid.properties文件

步骤:new directory(名称:resource)-选中resource,右键标记为mark directory as directory root

,接着右键文件夹,new File,创建druid.properties文件

driverClassName=com.mysql.jdbc.Driver
#这里注意url写的是自己的数据库
url=jdbc:mysql://localhost:3306/day18?characterEncoding=utf8
username=root
password=123456
#初始化连接数

initialSize=5
#最大活动连接数
maxActive=10
#最大等待时间
maxWait=1000

(3)接着创建class文件,测试配置

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.junit.Test;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.util.Properties;

public class TestDataSource {
    @Test
    public void test01() throws Exception {
        //1、创建properties对象,让其去读取druid.properties文件
        Properties properties = new Properties();
        //1.1将druid.properties配置文件转成字节输入流
        FileInputStream is = new FileInputStream("E:\\java\\MySQL_Test\\resources\\druid.properties");
        //1.2使用properties对象加载流
        properties.load(is);

        //2、使用DruidDataSourceFactory创建Druid对象,这里包名选择的时候注意要选择短的,长的是Druid对mybatis框架的支持
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

        //3、从连接池中取出一个连接使用
        Connection conn1 = dataSource.getConnection();
        Connection conn2 = dataSource.getConnection();
        Connection conn3 = dataSource.getConnection();
        Connection conn4 = dataSource.getConnection();
        Connection conn5 = dataSource.getConnection();
        Connection conn6 = dataSource.getConnection();
        Connection conn7 = dataSource.getConnection();

        //4、归还连接:没有使用连接池的时候connection.close()就是销毁连接,
        // 如果是从连接池中取出的connection对象调用close()方法,就是将连接归还给连接池
        //底层原理是动态代理
        conn1.close();

    }
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐