★ Spring Boot如何选择DataSource数据源
优先级从高到低: HikariCP > Tomcat pooling DataSource > Commons DBCP2
如果要使用Tomcat pooling DataSource这种池化数据源,
那么可以用</exclusions>这个把HikariCP 排除掉,然后springboot就会自动去使用Tomcat pooling DataSource
Spring Boot 的 spring-data-starter-jdbc 默认就自带了 HikariCP 的JAR包。
如果你不指定任何额外信息,Spring Boot默认会为我们创建HikariCP 的数据源。
这样移除这个HikariCP
★ 数据源相关配置
数据源的通用配置以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 数据源的配置:
运行代码,成功查询到数据库的数据,表示这个 C3P0 数据源 配置的没有问题
代码是延用上一篇文章提及的spring data jpa 的 crud 。
其他代码在上一篇 --> 66、Spring Data JPA 的基本功能–CRUD 和 分页 – 可获取
关于在配置文件中的写法及其写法来源:
1、首先是前缀,在配置类中的bean组件上面添加这个@ConfigurationProperties(“cn.ljh.datasource”),这个bean组件就会去配置文件中读取有这个cn.ljh.datasource开头的属性,如图
2、关于 cn.ljh.datasource.xxx.xxx,这个 xxx 是怎么来的
可以通过 C3P0的jar包中的类得来的。
具体的各种数据源的配置的写法,都是根据这个类里面的 setter 方法得来的,不是乱写的。
都是固定的。
也可以这么找
如图:配置文件中的属性的写法,都是在类中有对应的set方法
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
配置文件:
写法来源跟第一个一样
可以在jar包找,也可以直接点 HikariDataSource 类进去查看相应的setter方法
可在容器中用@Bean配置多个数据源。
如果希望Spring Boot能依赖注入某个数据源,可用 @Primary 注解修饰它。
——@Primary 注解 修饰的数据源将作为整个应用默认的数据源。
【注意:】,如果你要配置多个数据源,必须自己显式地在容器中配置多个。
不可能说你配置一个,Spring Boot帮你自动配置一个,这是不可能的。
Spring Boot自动配置的DataSource Bean有一个@ConditionalOnMissingBean(DataSource.class)。
@Primary
有多个数据源,但是以哪个为主,就可以通过@Primary这个注解来指定
比如指定 C3P0 这个数据源。
其对应的数据是有数据的。
测试一下
@Primary 注解 修饰这个 Hikari 数据源 作为整个应用默认的数据源。
测试正确,因为这个 Hikari 数据源对应的数据库什么数据都没有