一、如何配置数据源
手动配置所需的Bean
- 数据源相关:DataSource(根据选择的连接池决定)
- 事务相关(可选)
- PlatformTransactionManager(DataSourceTransactionManager)
- TransactionTemplate
操作相关(可选)
DataSourceAutoConfiguration:配置DataSource
- DataSourceTransactionManagerAutoConfiguration
- JdbcTemplateAutoConfiguration:配置JdbcTemplate
- 符合条件时才进行配置
数据源相关配置属性
// 通用
spring.datasource.url=jdbc:mysql//localhost/test
spring.datasource.username=root
spring.datasource.password=password
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中的多数据源配置
手工配置两组DataSource及相关内容
- 与Spring Boot协同工作(二选一)
- 配置@Primary类型的Bean
- 排除Spring Boot的自动配置
- DataSourceAutoConfiguration
- DataSourceTransactionManagerAutoConfiguration
- JdbcTemplateAutoConfiguration
三、好用的连接池:HikariCP
HikariCP为什么这么快
- 字节码级别优化(很多方法通过JavaAssist生成)
- 大量的小改进:
- 用FastStatementList代替ArrayList
- 无锁集合ConcurrentBag(借鉴了C#的概念)
- 代理类的优化(比如,用invokestatic代替了invokevirtual)
四、在SpringBoot中配置HikariCP
Spring Boot 2.x
- 默认使用HikariCP
- 配置spring.datasource.hikari.*配置,常用配置:
spring.datasource.hikari.maximumPoolSize=5
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.idleTimeout=600000
spring.datasource.hikari.connectionTimeout=30000
spring.datasource.hikari.maxLifetime=1800000
Spring Boot 1.x
- 默认使用Tomcat连接池,需要移除tomcat-jdbc依赖
- spring.datasource.type=com.zaxxer.hikari.HikariDataSource
五、好用的连接池:Alibaba Druid
官方介绍
Druid的优点
- 经过阿里巴巴各大系统的考验
- 实用的功能
- 详细的监控
- ExceptionSorter,针对主流数据库的返回码都有支持
- SQL防注入
- 内置加密配置
- 众多扩展点,方便进行定制
数据源配置
- 需要先排除原来的HikariCP依赖
- 直接配置DruidDataSource
- 通过druid-spring-boot-starter
- spring.datasource.druid.*
- 具体配置查看:官方wiki
- 常见配置
Druid Filter
- spring.datasource.druid.*
- 用于定制连接池操作的各种环节
- 可以继承FilterEventAdapter以便方便地实现Filter
- 修改resources/META-INF/druid-filter.properties增加FIlter配置
连接池选择时的考量点
六、Spring JDBC
Spring的JDBC操作类,spring-jdbc包
- core,JdbcTemplate等相关核心接口和类
- datasource,数据源相关辅助类
- object,将基本的JDBC操作封装成对象
-
Spring中常用的Bean注解,通过注解定义Bean
@Component,用来定义一个通用的Bean
- @Repository:数据库操作(DAO)
- @Service:业务服务
- @Controller:Spring MVC
@RestController:Restful WebService
简单的JDBC操作
JdbcTemplate
JdbcTemplate
- batchUpdate
- BatchPreparedStatementSetter
- batchUpdate
- NamedParameterJdbcTemplate
- batchUpdate
- SqlParameterSourceUtils.createBatch
- batchUpdate
七、Spring的事务抽象
一致的事务模型
- JDBC/Hibernate/myBatis
-
事务抽象的核心接口
PlatformTransactionManager
- DataSourceTransactionManager
- HibernateTransactionManager
- JtaTransactionManager
- TransactionManager
编程式事务
- TransactionTemplate
- TransactionCallback
- TransactionCallbackWithoutResult
- PlatformTransactionManager
- 可以传入TransactionDefinition进行定义
声明式事务
基于注解的配置方式
三种情况的例子
- 第三种在类内部调用insertThenRollback不会回滚
八、Spring的JDBC异常抽象
Spring会将数据操作的异常转换为DataAccessException
- 无论使用何种数据访问方式,都能使用一样的异常
Spring是怎么认识那些错误码的
- 通过SQLErrorCodeSQLExceptionTranslator解析错误码
ErrorCode定义
- 在这个路径下:org/springframework/jdbc/supports/sql-error-codes.xml
- 各个数据库都有特定的bean
- Classpath 下的 sql-error-codes.xml 可以放自定义的去覆盖官方定义的
定制错误码解析逻辑
- customTranslations