67、数据源配置 及 配置多个数据源--C3P0 数据源 和 Hikari 数据源

★ Spring Boot如何选择DataSource数据源

优先级从高到低: HikariCP > Tomcat pooling DataSource > Commons DBCP2
如果要使用Tomcat pooling DataSource这种池化数据源,
那么可以用这个把HikariCP 排除掉,然后springboot就会自动去使用Tomcat pooling DataSource


Spring Boot 的 spring-data-starter-jdbc 默认就自带了 HikariCP 的JAR包。

如果你不指定任何额外信息,Spring Boot默认会为我们创建HikariCP 的数据源。

这样移除这个HikariCP
67、数据源配置 及 配置多个数据源--C3P0 数据源 和 Hikari 数据源_第1张图片

★ 数据源相关配置

数据源的通用配置以spring.datasource.*开头的属性进行配置。

spring.datasource.*开头的属性由DataSourceProperties类负责加载、处理。

如果想对特定数据源实现增加配置,可通过特定前缀的属性进行配置,例如:
- spring.datasource.hikari.*:专门配置HikariCP的属性。
- spring.datasource.tomcat.*:专门配置Tomcat池化数据源的属性。
- spring.datasource.dbcp2.*:专门配置DBCP2数据源的属性。


@ConfigurationProperties可修饰类,将该类变成属性处理类。

@ConfigurationProperties还可修饰 @Bean 配置 Bean组件,
此时该注解读取的配置文件中的每个属性都会调用该Bean的一个setter方法
比如在配置文件中读到一个abc属性,它就会尝试调用配置Bean的setAbc()方法

★ 配置第三方数据源(C3P0)

首先需要排除HikariCP依赖库,还要添加C3P0的依赖

▲ 简单配置方式,只要一行(不能定制,早期版本才支持,Spring Boot 2.4开始不再支持):
spring.datasource.type=com.mchange.v2.c3p0.ComboPooledDataSource


▲ 复杂配置(用自定义的数据源代替自动配置的数据源)

(1)先在容器中用@Bean配置一个C3P0数据源
(2)然后用@ConfigurationProperties读取配置属性来对C3P0数据源进行配置

代码演示:配置第三方数据源(比如配置 C3P0 数据源)

在配置文件中写了对应的属性,在配置类中用@ConfigurationProperties读取。
这样就完成了对 C3P0 数据源的配置:
67、数据源配置 及 配置多个数据源--C3P0 数据源 和 Hikari 数据源_第2张图片
运行代码,成功查询到数据库的数据,表示这个 C3P0 数据源 配置的没有问题
代码是延用上一篇文章提及的spring data jpa 的 crud 。
其他代码在上一篇 --> 66、Spring Data JPA 的基本功能–CRUD 和 分页 – 可获取
67、数据源配置 及 配置多个数据源--C3P0 数据源 和 Hikari 数据源_第3张图片

关于在配置文件中的写法及其写法来源:
1、首先是前缀,在配置类中的bean组件上面添加这个@ConfigurationProperties(“cn.ljh.datasource”),这个bean组件就会去配置文件中读取有这个cn.ljh.datasource开头的属性,如图
67、数据源配置 及 配置多个数据源--C3P0 数据源 和 Hikari 数据源_第4张图片
2、关于 cn.ljh.datasource.xxx.xxx,这个 xxx 是怎么来的
可以通过 C3P0的jar包中的类得来的。
具体的各种数据源的配置的写法,都是根据这个类里面的 setter 方法得来的,不是乱写的。
都是固定的。
67、数据源配置 及 配置多个数据源--C3P0 数据源 和 Hikari 数据源_第5张图片
也可以这么找
67、数据源配置 及 配置多个数据源--C3P0 数据源 和 Hikari 数据源_第6张图片

如图:配置文件中的属性的写法,都是在类中有对应的set方法
67、数据源配置 及 配置多个数据源--C3P0 数据源 和 Hikari 数据源_第7张图片
3、关于为什么 cn.ljh.datasource.driver-class 是 driver-class 这个写法
因为配置类中的bean组件的这个@ConfigurationProperties(“cn.ljh.datasource”),该注解读取的每个属性都会调用该Bean的一个setter方法。
比如在配置文件中读到一个【cn.ljh.datasource.initial-pool-size=3】的属性,它就会尝试调用配置bean 的 setInitialPoolSize() 方法。
也就是调用AbstractComboPooledDataSource类中的 setInitialPoolSize() 方法。(这句不知道对不对)

比如:setInitialPoolSize ,写在配置文件中,set 去掉,首字母小写,大写的字母改成小写,然后用 - 隔开,就变成 initial-pool-size

★ 配置多个数据源

可在容器中用@Bean配置多个数据源。

如果希望Spring Boot能依赖注入某个数据源,可用 @Primary 注解修饰它。
——@Primary 注解 修饰的数据源将作为整个应用默认的数据源。

【注意:】,如果你要配置多个数据源,必须自己显式地在容器中配置多个。
            不可能说你配置一个,Spring Boot帮你自动配置一个,这是不可能的。
            Spring Boot自动配置的DataSource Bean有一个@ConditionalOnMissingBean(DataSource.class)。

代码演示:配置多个数据源

上面已经配置了一个 C3P0 的数据源,再配一个 Hikari 的数据源

配置类中的 Datasource Bean
67、数据源配置 及 配置多个数据源--C3P0 数据源 和 Hikari 数据源_第8张图片

配置文件:
67、数据源配置 及 配置多个数据源--C3P0 数据源 和 Hikari 数据源_第9张图片

写法来源跟第一个一样
可以在jar包找,也可以直接点 HikariDataSource 类进去查看相应的setter方法
67、数据源配置 及 配置多个数据源--C3P0 数据源 和 Hikari 数据源_第10张图片

可在容器中用@Bean配置多个数据源。

如果希望Spring Boot能依赖注入某个数据源,可用 @Primary 注解修饰它。
——@Primary 注解 修饰的数据源将作为整个应用默认的数据源。

【注意:】,如果你要配置多个数据源,必须自己显式地在容器中配置多个。
            不可能说你配置一个,Spring Boot帮你自动配置一个,这是不可能的。
            Spring Boot自动配置的DataSource Bean有一个@ConditionalOnMissingBean(DataSource.class)。

@Primary

有多个数据源,但是以哪个为主,就可以通过@Primary这个注解来指定

比如指定 C3P0 这个数据源。
其对应的数据是有数据的。
测试一下

67、数据源配置 及 配置多个数据源--C3P0 数据源 和 Hikari 数据源_第11张图片

@Primary 注解 修饰这个 Hikari 数据源 作为整个应用默认的数据源。
测试正确,因为这个 Hikari 数据源对应的数据库什么数据都没有
67、数据源配置 及 配置多个数据源--C3P0 数据源 和 Hikari 数据源_第12张图片

你可能感兴趣的:(springboot,C3P0,DataSource,Hikari)