DataSource对象的理解

一、DataSource 对象

1. 什么是DataSource对象

DataSource对象是javax.sql包中的一个接口,其实就是可以标识为一个数据库连接资源,数据源对象里面应该存储连接的url,用户名和密码等连接信息。

在使用JDBC连接数据库的时候,都使用通过DriverManager进行获取Connection对象,getConnection方法都需要传递url,name.passwd等信息,其实这些信息就是可以充当一个数据源对象。

2. 数据源和数据连接池的区别

数据源就是一个数据的来源,相当于数据库。但是程序去访问数据库并不直接访问,会通过一个代理,也就是数据连接池,每一个数据连接池引用的对象肯定有数据源。DataSource的实现子类有很多,其中很多第三方的连接池都是需要实现DataSource的,如果创建一个带数据池的数据源,则就有连接池功能了。

​ 比如:Mybatis就有默认的数据源实现类

  <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://172.23.23.166:3306/DB_ATY?characterEncoding=UTF-8&amp;allowMultiQueries=true"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>

在mybatis-config配置数据源的时候,就可以指定type为POOLED\UNPOOLED\JNDI

img

3. druid连接池

比如现在项目中使用的数据源连接池为:DruidDataSource。

Druid是阿里开源的数据库连接池,性能比C3P0\DBCP更高,提供监控功能,可以监听sql语句的执行时间、ResultSet持有时间、返回行数、更新行数、分析SQL的执行性能。

durid有如下参数用于来配置数据库连接池信息。

  1. iniitialSize 初始化连接数,比如初始化10个连接
  2. minidle 最小连接数也10个,应该和初始化保持一致,如果初始化的时候要疯狂连接数据库则初始化的时候可以开大点
  3. maxActve 最大连接数,应该和最大并发量保持一致吧
  4. maxWait 应该尽量保持再一分钟,不能太长,不让给用户不好的体验
  5. validationQuery

现在一直不知道连接池的一些参数应该配置多少,有时间再去了解。

二、Spring是如何管理DataSource对象的

其实我理解的是,spring就将DataSource作为一个bean对象而且,你可以在spring项目中声明多个datasource对象。管理的话主要还是得看spring如何跟mybatis等一些需要数据连接池的框架是如何进行交互。

  1. 在springboot中如何声明一个DataSource对象?

    spring:
      datasource:
        type:xxx
        url:xxx
        username:xxx
        password:xxx
    

    直接在application.yml编写这样的声明,springboot则会自动注入一个dataSource的bean对象,但是如果需要使用多数据源的话,则不能这样写,并且需要手动配置生成DataSource对象。

  2. 多数据源应该如何创建DataSource对象?

    @Bean(name = "dmDatasourceProperties")
    @Qualifier("dmDatasourceProperties")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.xx")
    public DataSourceProperties xxDatasourceProperties() {
        return new DataSourceProperties();
    }

    @Bean(name = "xxDatasource")
    @Qualifier("xxDatasource")
    @Primary
    public DataSource xxDatasource() {
        return xxDatasourceProperties().initializeDataSourceBuilder().build();
    }

这样就配置好了对应的name的数据源了

  1. jdbcTemplate选择对应的数据库源

比如使用JdbcTemplate,JdbcTemplate是一个已经封装好的对象,但是一开始肯定没有注入到spring容器中(如果有默认的数据库源的话可能也注入进去了),应该创建JdbcTemplate对象注入到spring容器中,这个时候就需要一个DataSource数据源了。

  @Bean(name = "jdbcTemplate")
    public JdbcTemplate getJdbc(){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(xxDatasource());
        return jdbcTemplate;
    }
posted @ 2021-10-29 16:56  逆水不进则退  阅读(999)  评论(0)    收藏  举报