Spring Boot (14) 数据源配置原理
数据源配置源码
这里截取org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration的部分源码,主要介绍Tomcat和Hikari连接池如何自动配置切换,其他数据源配置也是一样的原理
...
//Tomcat数据源配置-如果当前环境中加载了括号里面的class,注解条件成立,系统将会加载被注解的内容
@ConditionalOnClass({org.apache.tomcat.jdbc.pool.DataSource.class})
//如果在properties中配置了spring.datasource.type=org.apache.tomcat.jdbc.poll.DataSource则条件成立 matchIfMissing=true 如果没有配置这个参数,默认条件成立
@ConditionalOnProperty(
name = {"spring.datasource.type"},
havingValue = "org.apache.tomcat.jdbc.pool.DataSource",
matchIfMissing = true
)
//上面两个条件都成立,系统会加载Tomcat数据源配置
static class Tomcat extends DataSourceConfiguration {
Tomcat() {
}
//将方法返回的bean 注入spring
@Bean
//将properties文件中以spring.datasource.tomcat开头的属性值注入到方法返回的bean(tomcat连接池)
@ConfigurationProperties("spring.datasource.tomcat")
public org.apache.tomcat.jdbc.pool.DataSource dataSource(DataSourceProperties properties) {
org.apache.tomcat.jdbc.pool.DataSource dataSource = (org.apache.tomcat.jdbc.pool.DataSource)this.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;
}
}
...
Hikari数据源配置,注解意思同上
@ConditionalOnClass({HikariDataSource.class})
@ConditionalOnProperty(
name = {"spring.datasource.type"},
havingValue = "com.zaxxer.hikari.HikariDataSource",
matchIfMissing = true
)
static class Hikari extends DataSourceConfiguration {
Hikari() {
}
@Bean
@ConfigurationProperties("spring.datasource.hikari")
public HikariDataSource dataSource(DataSourceProperties properties) {
return (HikariDataSource)this.createDataSource(properties, HikariDataSource.class);
}
}
默认tomcat连接池
只要在spring boot中添加了jdbc组建,就会自动加载tomcat连接池的class。从源码中可以看出,默认会加载tomcat连接池。
配置Hikari连接池
Hikari连接池是当前最好的连接池,可以参考官方测试数据。
1.spring boot默认没有Hikari的class,需要在pom.xml中添加依赖,Hikari的第一个注解条件才会成立
<!--Hikari连接池 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
2.application.yml中配置,会造成tomcat连接池第二个注解条件不成立,并使Hikari的第二个注解条件成立
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
如果不配置datasource.type属性,spring boot会按照它的顺序进行加载,加载了一个 已经有了就不会再注入后面的连接池了。
druid
druid连接池可能在国外不流行,在spring boot并没有其相关源码,不过只要添加了druid组建依赖,会优先配置druid连接池,就不会再加载本篇的所有配置,这是在druid组件中自动实现的。
查看当前数据库
如果要验证当前运行的数据源到底是哪一个,可以在控制层用以下方法查看
@Resource
javax.sql.DataSource dataSource;
@RequestMapping("/")
public void test() {
System.out.println(dataSource.getClass());
}
class com.alibaba.druid.pool.DruidDataSource
Spring Boot (14) 数据源配置原理的更多相关文章
- spring boot(12)-数据源配置原理
本篇讲的不仅是数据源配置,这也是spring boot实现自动配置的一部分.要理解数据源的配置原理,首先要理解第十篇tomcat连接池的配置 数据源配置源码 这里截取org.springframewo ...
- Spring Boot多数据源配置(二)MongoDB
在Spring Boot多数据源配置(一)durid.mysql.jpa 整合中已经讲过了Spring Boot如何配置mysql多数据源.本篇文章讲一下Spring Boot如何配置mongoDB多 ...
- Spring Boot的自动配置原理及启动流程源码分析
概述 Spring Boot 应用目前应该是 Java 中用得最多的框架了吧.其中 Spring Boot 最具特点之一就是自动配置,基于Spring Boot 的自动配置,我们可以很快集成某个模块, ...
- spring boot多数据源配置(mysql,redis,mongodb)实战
使用Spring Boot Starter提升效率 虽然不同的starter实现起来各有差异,但是他们基本上都会使用到两个相同的内容:ConfigurationProperties和AutoConfi ...
- 三、Spring Boot 多数据源配置
下面一个Java类是已经写好的根据配置文件动态创建多dataSource的代码,其原理也很简单,就是读取配置文件,根据配置文件中配置的数据源数量,动态创建dataSource并注册到Spring中. ...
- Spring Boot Druid数据源配置
package com.hgvip.config; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.su ...
- 21. Spring Boot Druid 数据源配置解析
1.数据源配置属性类源码 package org.springframework.boot.autoconfigure.jdbc; @ConfigurationProperties( prefix = ...
- spring boot 多数据源配置与使用
在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源.在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.properties文 ...
- Spring Boot多数据源配置与使用
在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.properties文件中配置连接参数即可.但是往往随着业务量发展,我们通常会进行数据库拆分或是引入其他数据库 ...
随机推荐
- NTP测试1
ntp server A : 10.101.75.8 B : 10.101.75.38 B: [root@r10n16313.sqa.zmf /home/ahao.mah] #cat /etc/ntp ...
- 洛谷——P2814 家谱
P2814 家谱 题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. 输入输出格式 输入格式: 输入由多行组成,首先是一系列有关父子关系 ...
- 谈一谈Dijkstra
dijkstra呢是最短路三大算法之一.很多人都觉得不如spfa,但是这两者在跑稠密图时,dijkstra有奇效 在讲之前先说一说食用方法: 适用于有向的无负权值的图. 样例飘过 6 9 1 //n个 ...
- 【转载】xShell5 利用 sftp 在本地和服务器之间传输文件
sftp是Secure File TransferProtocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp与 ftp有着几乎一样的语法和功能.SFTP为 SSH的一部分 ...
- jQuery练习:表单模态框
代码:基于事件冒泡原理和事件委托 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta cha ...
- CentOS7下安装ELK三件套
ELK用于分布式收集,然后elasticsearch用于分析数据,在Kibana中可以查看数据.报表. 目前公司日志数据量暂时不使用elasticsearch集群,只是用的elasticsearch单 ...
- Vue 安装教程
1.下载node.js https://nodejs.org/en/ 2.检查环境变量: npm init (初始化项目) npm i webpack vue vue-loader 安装依赖: npm ...
- sprintf_s函数用法
函数功能:将数据格式化输出到字符串 函数原型: int sprintf_s( char *buffer, size_t sizeOfBuffer, const char *format [, argu ...
- nyoj_18_The Triangle_201312071533
The Triangle 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure ...
- [bzoj2783][JLOI2012]树_树的遍历
树 bzoj2783 JLOI2012 题目大意:给定一棵n个点的树.求满足条件的路径条数.说一个路径是满足条件的,当且仅当这条路径上每个节点深度依次递增且点权和为S. 注释:$1\le n\le 1 ...