2022-08-20 数据库连接池

发布于:2023-01-09 ⋅ 阅读:(396) ⋅ 点赞:(0)

Connection是一种稀有资源,一个连接建立就创造了一个资源。

举个例子:

QQ连接上了,我的QQ和腾讯的服务器建立了一个连接,有代价,因为需要远程的去连接,所以说连接是一个很宝贵的资源,如果同时在线人数很多就有可能导致服务器崩溃。

所以就有两种情况(解决方案):

第一种:我一个人玩(我自己一个服务器),那肯定不会崩溃。

第二种:把服务器的人数限定一下,限定10000个人,最多不超过10000人,第10001个人上线,就需要排队。

那我们使用JDBC到时候是必须要使用连接池的:

JDBC使用数据库连接池的必要性:

在使用基于web程序的数据库的连接,在主程序中建立连接,执行sql,断开连接

所有的JDBC连接通过DriverManager.Connection连接.

我们用完的连接不要被垃圾回收,能够重复使用

所以需要“池化思想

我们每次去初始化一个连接池,连接池中会有很多个连接在等待被使用。

使用完连接之后,也不需要关闭连接,只需要把连接还回到连接池。

还回到连接池的操作还不需要我们手动控制。

初始化连接池,10条连接,来了20个请求,10个请求就直接拿走10条连接去进行操作,剩下的10个请求,有两种方式:一:等待前面10个请求结束,拿来用。二:我再向服务器申请连接数。

连接池的数据池:

(1)C3P0:二代数据库连接池,太老了,不学

(2)DBCP:二代数据库连接池,太老了,不学

(3)Druid:(德鲁伊)数据库连接池,现在市面上最好用的连接池。

                阿里巴巴开源平台上的一个数据库连接池的实现,整合了C3P0和DBCP各自的优点

                加入了日志监控,可以监控sql语句的执行情况

(4)Hikari(光),目前最快的连接池。springboot默认的连接池。

用数据池的前提:必须要有对应的属性文件和导入jar包

.properties文件

约定 > 配置 > 编码

例如:德鲁伊数据库连接池

druid.properties文件:(和之前写的jdbc.properties文件里的内容不一样)需要把mysql改成druid:

druid.url=jdbc:mysql://127.0.0.1:3306/wy?useUnicode=true&characterEncoding=utf8
druid.username=root
druid.password=root
druid.driverName=com.mysql.jdbc.Driver

druid.initialSize=10//初始化链接数
druid.maxActive=20//最大连接数
druid.maxWait=20//获取连接最大等待时间

在方法中:

Properties properties = new Properties();        properties.load(Ch01.class.getClassLoader().getResourceAsStream("druid.properties"));
//创建一个properties对象,拿到文件信息,加载到对象当中。
//之后创建一个德鲁伊文件数据源:
DruidDataSource druidDataSource = new DruidDataSource();
//直接加载属性文件
druidDataSource.configFromPropety(properties);
//从数据库连接池中拿连接
druidDataSource.getConnection();

HikariConfig光数据库连接池:

hikari.properties文件:

jdbcUrl=jdbc:mysql://127.0.0.1:3306/wy?useUnicode=true&characterEncoding=utf8
username=root
password=020323
driverClassName=com.mysql.jdbc.Driver

方法调用: 

Properties properties = new Properties();
        properties.load(Ch01.class.getClassLoader().getResourceAsStream("hikari.properties"));

HikariConfig hikariConfig = new HikariConfig(properties);
HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);
        
hikariDataSource.getConnection();

利用数据库连接池(德鲁伊)做一个工具类(操作数据源)

java提供的一个标准接口:DataSource

目的:为了获取数据源(不用写那些文件等),再去获取连接,连接不需要关闭

public class BaseDao {
    public static final DataSource DATA_SOURCE;
    static {
        Properties properties = new Properties();
        try {          properties.load(Ch01.class.getClassLoader().getResourceAsStream("druid.properties"));
            // 创建德鲁伊的数据源,德鲁伊提供的一个静态方法
            DATA_SOURCE = DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    public static void closeAll(Statement stmt, ResultSet rs) {
        if(Objects.nonNull(stmt)) {
            try {
                stmt.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if(Objects.nonNull(rs)){
            try {
                rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

我简要说明一个东东,因为博主也不是很理解,所以写的不对,请大家矫正:

我们未来写项目的时候,会使用封装的思想,采用接口的形式,把一个一个类共同的连接方法通过接口的方式完成eg:

有Teacher类和User类封装基础属性,然后之前我们的方式是通过XXXDao来写关于自己本类的方法,但是现在我们可以通过IBaseDao接口设置基础方法,再通过BaseDaoImpl实现接口补全方法内容,之后XXXDao继承BaseDaoImpl,这样我们不需要再XXXDao里面写方法,就可以调用连接。由于代码过多,我就不写了,有需要的可以私信我。

DBUtils:

使用的是一个类:QueryRunner:

类传入的是数据源DataSource,不是一个Connection

QueryRunner runner = new QueryRunner(BaseDao.DATA_SOURCE);

//修改
runner.update("update teacher set name = ? where id = ?", "mmm", 6);
runner.query("select * from 表名 where id = ?",new BeanHandler<>(类名.class),1);
//查询一个
runner.query("",new BeanHandler)
//查询所有
runner.query("sql语句",new BeanListHandler<>(类名.class));
本文含有隐藏内容,请 开通VIP 后查看