目录
如何配置数据源
Spring Boot 做了哪些配置
DataSourceAutoConfiguration 配置 DataSource
DataSourceTransactionManagerAutoConfiguration 配置 DataSourceTransactionManager
JdbcTemplateAutoConfiguration 配置 JdbcTemplate
数据源相关配置属性
通⽤
- spring.datasource.url=jdbc:mysql://localhost/test
- spring.datasource.username=dbuser
- spring.datasource.password=dbpass
- spring.datasource.driver-class-name=com.mysql.jdbc.Driver(可选)
初始化内嵌数据库
- spring.datasource.initialization-mode=embedded|always|never
- spring.datasource.schema与spring.datasource.data确定初始化SQL⽂文件
- spring.datasource.platform=hsqldb | h2 | oracle | mysql | postgresql(与前者对应)
配置多数据源的注意事项
- 不同数据源的配置要分开
- 关注每次使⽤用的数据源
- 有多个DataSource时系统如何判断
- 对应的设施(事务、ORM等)如何选择DataSource
Spring Boot中的多数据源配置
⼿工配置两组 DataSource 及相关内容
与Spring Boot协同工作(二选⼀)
- 配置@Primary类型的Bean
- 排除Spring Boot的⾃动配置
- DataSourceAutoConfiguration
- DataSourceTransactionManagerAutoConfiguration
- JdbcTemplateAutoConfiguration
数据库连接池
连接池选择时的考量量点
- 可靠性
- 性能
- 功能
- 可运维性
- 可扩展性
- 其他
HikariCP
HikariCP 为什么快
1. 字节码级别优化(很多方法通过 JavaAssist 生成)
2. ⼤量小改进
- 用 FastStatementList 代替 ArrayList
- 无锁集合 ConcurrentBag
- 代理类的优化(⽐如,用 invokestatic 代替了 invokevirtual)
在 Spring Boot 2.x 中 默认使⽤用 HikariCP
spring.datasource.hikari.*
Spring Boot 1.x 默认使用 Tomcat 连接池,需要移除 tomcat-jdbc 依赖
- spring.datasource.type=com.zaxxer.hikari.HikariDataSource
常用 HikariCP 配置参数
常用配置
- spring.datasource.hikari.maximumPoolSize=10
- spring.datasource.hikari.minimumIdle=10
- spring.datasource.hikari.idleTimeout=600000
- spring.datasource.hikari.connectionTimeout=30000
- spring.datasource.hikari.maxLifetime=1800000
其他配置详见 HikariCP 官⽹网
https://github.com/brettwooldridge/HikariCP
Alibaba Druid
“Druid连接池是阿⾥巴巴开源的数据库连接池项目。Druid连接池为监控⽽生, 内置强⼤的监控功能,监控特性不影响性能。功能强⼤大,能防SQL注⼊入,内置 Logging能诊断Hack应⽤行为。” –Alibaba Druid 官⽅方介绍
实⽤的功能
- 详细的监控(真的是全面)
- ExceptionSorter,针对主流数据库的返回码都有支持
- SQL 防注⼊
- 内置加密配置 众多扩展点,⽅便进行定制
数据源配置
直接配置 DruidDataSource
通过 druid-spring-boot-starter
- spring.datasource.druid.*
Filter 配置
- spring.datasource.druid.filters=stat,config,wall,log4j (全部使⽤用默认值)
密码加密
- spring.datasource.password=<加密密码>
- spring.datasource.druid.filter.config.enabled=true
- spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=<public-key>
SQL 防注入
- spring.datasource.druid.filter.wall.enabled=true
- spring.datasource.druid.filter.wall.db-type=h2
- spring.datasource.druid.filter.wall.config.delete-allow=false
- spring.datasource.druid.filter.wall.config.drop-table-allow=false
Druid Filter
- 用于定制连接池操作的各种环节
- 可以继承 FilterEventAdapter 以便便⽅方便便地实现 Filter
- 修改 META-INF/druid-filter.properties 增加 Filter 配置
通过 Spring JDBC 访问数据库
Spring 的 JDBC 操作类
spring-jdbc
- core,JdbcTemplate 等相关核心接⼝和类
- datasource,数据源相关的辅助类
- object,将基本的 JDBC 操作封装成对象
- support,错误码等其他辅助工具
简单的 JDBC 操作
JdbcTemplate
- query
- queryForObject
- queryForList
- update
- execute
SQL 批处理
JdbcTemplate
batchUpdate
- BatchPreparedStatementSetter
NamedParameterJdbcTemplate
batchUpdate
- SqlParameterSourceUtils.createBatch
了解 Spring 的抽象
Spring 的事务抽象
一致的事务模型
- JDBC/Hibernate/myBatis
- DataSource/JTA
事务抽象的核⼼接口
PlatformTransactionManager
• DataSourceTransactionManager
• HibernateTransactionManager
• JtaTransactionManager
TransactionDefinition
• Propagation
• Isolation
• Timeout
• Read-only status
事务传播特性
传播性 |
值 |
描述 |
PROPAGATION_REQUIRED |
0 |
当前有事务就⽤当前的,没有就⽤新的 |
PROPAGATION_SUPPORTS |
1 |
事务可有可无,不是必须的 |
PROPAGATION_MANDATORY |
2 |
当前一定要有事务,不然就抛异常 |
PROPAGATION_REQUIRES_NEW |
3 |
⽆论是否有事务,都起个新的事务 |
PROPAGATION_NOT_SUPPORTED |
4 |
不支持事务,按非事务⽅式运行 |
PROPAGATION_NEVER |
5 |
不支持事务,如果有事务则抛异常 |
PROPAGATION_NESTED |
6 |
当前有事务就在当前事务里里再起⼀个事务 |