300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 深入理解Spring Boot数据源与连接池原理

深入理解Spring Boot数据源与连接池原理

时间:2019-09-25 17:27:49

相关推荐

深入理解Spring Boot数据源与连接池原理

​ 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,或者不写都会认为可以通过。只有通过才会进入这段配置代码,才能注入DataSourceBean。

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

3.Tomcat常用属性

4.Tomcat JDBC 增强属性

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。