Create by yster@ -8-2
一:开始
在使用Spring Boot数据源之前,我们一般会导入相关依赖。其中数据源核心依赖就是spring‐boot‐starter‐jdbc
如下
<dependency><groupId>org.springframework.boot</groupId> <artifactId>spring‐boot‐starter‐jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql‐connector‐java</artifactId> <scope>runtime</scope> </dependency>
或者你使用的是JPA:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>
查看JPA的依赖关系,如图,其中已经包含JDBC。
二:数据源
配置我们的Mysql数据库连接信息:
spring:datasource:username:rootpassword:123456url:jdbc:mysql://192.168.15.22:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=falsedriver‐class‐name:com.mysql.jdbc.Driver
1.如何查看当前数据源?
编写单元测试
@RunWith(SpringRunner.class)@SpringBootTestpublic class RobotsApplicationTests {@AutowiredDataSource dataSource;@Testpublic void test(){System.out.println(dataSource.getClass());}}
查看打印:
class org.apache.tomcat.jdbc.pool.DataSource
总结
所以这段配置的效果就是,默认是用org.apache.tomcat.jdbc.pool.DataSource作为数据源,
且数据源的相关配置都在DataSourceProperties里面,如下:
@ConfigurationProperties(prefix = "spring.datasource")public class DataSourcePropertiesimplements BeanClassLoaderAware, EnvironmentAware, InitializingBean {...private String name = "testdb";private String driverClassName;private String url;private String username;private String password;.....
2.自动配置原理
找到org.springframework.boot.autoconfigure.jdbc
包下的DataSourceConfiguration
类
abstract class DataSourceConfiguration {@ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true)static class Tomcat extends DataSourceConfiguration {@Bean@ConfigurationProperties(prefix = "spring.datasource.tomcat")public org.apache.tomcat.jdbc.pool.DataSource dataSource(DataSourceProperties properties) {org.apache.tomcat.jdbc.pool.DataSource dataSource = createDataSource(properties, org.apache.tomcat.jdbc.pool.DataSource.class);DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(properties.determineUrl());String validationQuery = databaseDriver.getValidationQuery();if (validationQuery != null) {dataSource.setTestOnBorrow(true);dataSource.setValidationQuery(validationQuery);}return dataSource;}}......
以上就是自动配置代码,原理大概是如果在classpath下存在org.apache.tomcat.jdbc.pool.DataSource.class
类,并且在配置文件中指定spring.datasource.type
的值为org.apache.tomcat.jdbc.pool.DataSource
,或者不写都会认为可以通过。只有通过才会进入这段配置代码,才能注入DataSource
Bean。
SpringBoot默认可以支持;
org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、BasicDataSource、
当然了,除了Tomcat数据源依赖自带,其他都是缺少状态。
3.自定义数据源
找到这个类的最下面,如果spring.datasource.type
的值不属于上面的几个,那么可以自己定义数据源:
@ConditionalOnMissingBean(DataSource.class)@ConditionalOnProperty(name = "spring.datasource.type")static class Generic {@Beanpublic DataSource dataSource(DataSourceProperties properties) {//使用DataSourceBuilder创建数据源,利用反射创建响应type的数据源,并且绑定相关属性return properties.initializeDataSourceBuilder().build();}}
4.自动执行SQL语句
打开DataSourceAutoConfiguration自动配置类,在自动配置DataSource时会注入DataSourceInitializer
,继续打开该类,
我们发现该类有一个方法被注解@PostConstruct
,这个注解用于需要在依赖注入完成后执行任何初始化的方法上。该初始化方法调用了runSchemaScripts();
该方法的第一句就调用getScripts()
方法,获取SQL脚本,如图:
所以我们想要初始化一些数据库脚本,可以依照这个规则
schema‐*.sql、data‐*.sql
例如:
schema.sql,schema‐all.sql;
也可以使用如下指定具体位置
schema: ‐classpath:department.sql
作用:
1)、runSchemaScripts();运行建表语句;
2)、runDataScripts();运行插入数据的sql语句;
5.操作数据库
自动配置了JdbcTemplate操作数据库,示例:
@RunWith(SpringRunner.class)@SpringBootTestpublic class RobotsApplicationTests {@AutowiredJdbcTemplate jdbcTemplate;@Testpublic void test(){jdbcTemplate.queryForList("SELECT * FROM user");}}
三:连接池
为什么要把数据源和连接池放在一起讲,因为当我们使用了如上所述的默认数据源之后,那么已默认启用了数据库链接池。 换句话说,你根本不需要关心连接池,它本来就有!
1.默认连接池规则
Tomcat7之前,Tomcat本质应用了DBCP连接池技术来实现的JDBC数据源,但在Tomcat7之后,Tomcat提供了新的JDBC连接池方案,作为DBCP的替换或备选方案,解决了许多之前使用DBCP的不利之处,并提高了性能。详细请参考:/project/tomcat/tomcat-jdbc-pool.html
Spring Boot为我们准备了最佳的数据库连接池方案,只需要在属性文件(例如application.properties)中配置需要的连接池参数即可。
在引入spring-boot-starter-jdbc后,内部包含了tomcat-jdbc包,里面有tomcat连接池.然后通过自动配置DataSourceAutoConfigurer创建DataSource对象。
SpringBoot创建默认DataSource时,规则如下:
优先寻找创建Tomcat连接池
如果没有Tomcat连接池,会查找创建HikariCP
如果没有HikariCP连接池,会查找创建dbcp
如果没有dbcp连接池,会查找创建dbcp2
可以使用spring.datasource.type属性指定连接池类型
spring.datasource.type=mons.dbcp.BasicDataSource
2.控制连接池行为
在数据源那一讲中,我们已经知道Spring data默认使用tomcat-jdbc时,所以直接在application.yml增加配置项spring.datasource.tomcat.*来控制链接池的行为。比如如下配置。
spring:datasource:url: jdbc:mysql://localhost:3306/jackieathome?useSSL=falseusername: rootpassword: mypassword# 6.x版本的MySQL JDBC驱动类为com.mysql.cj.jdbc.Driver# 5.X版本的MySQL JDBC驱动类为com.mysql.jdbc.Driverdriver-class-name: com.mysql.cj.jdbc.Drivertomcat:max-wait: 10000max-active: 30test-on-borrow: truemax-idle: 5