备注:以下笔记梳理来自极客时间-spring全家桶学习
1 配置数据源基本思路
- 引入对应数据库驱动
- 引入jdbc依赖–spring-boot-starter-jdbc
- 获取DataSourceBean
- [检查]通过/acurator/beans查看bean;
按需配置
如果是直接配置相关的bean这里需要注意一个数据源通常包括如下bean:
- 数据源相关
- DataSources(根据选择的连接池实现决定)
- 事务相关(可选)
- PlatformTransactionManager
- TransactionTemplate
- 操作相关(可选)
- JdbcTemplate
2 数据源相关配置属性
3 配置多数据源
两个注意事项
- 不同数据源的配置要分开
- 关注每次使用的数据源
- 有多个DataSource时系统如何判断
- 对应的设施(事务、 ORM等)如何选择DataSource
spring boot的配置方法
- 配置@Primary类型的Bean
- 排除Spring Boot的⾃自动配置
• DataSourceAutoConfiguration
• DataSourceTransactionManagerAutoConfiguration
• JdbcTemplateAutoConfiguration
具体配置及排除如下所示:
4 连接池:HikariCP
hikaricp为什么快:
- 字节码级别优化(很多⽅方法通过 JavaAssist ⽣生成)
- ⼤大量量⼩小改进
• ⽤用 FastStatementList 代替 ArrayList
• ⽆无锁集合 ConcurrentBag
• 代理理类的优化(⽐比如,⽤用 invokestatic 代替了了 invokevirtual)
spring相关配置
常用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
5 连接池Druid
druid使用功能
- 详细的监控
- ExceptionSorter,针对主流数据库的返回码都有⽀支持
- SQL 防注⼊入
- 内置加密配置
- 众多扩展点,⽅方便便进⾏行行定制
数据源配置
数据源配置:
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=
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
依赖配置:需要排除HikariCP
一个详细配置示例
spring.output.ansi.enabled=ALWAYS
spring.datasource.url=jdbc:h2:mem:foo
spring.datasource.username=sa
spring.datasource.password=n/z7PyA5cvcXvs8px8FVmBVpaRyNsvJb3X7YfS38DJrIg25EbZaZGvH4aHcnc97Om0islpCAPc3MqsGvsrxVJw==
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-active=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.filters=conn,config,stat,slf4j
spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=${public-key}
spring.datasource.druid.filter.config.enabled=true
spring.datasource.druid.test-on-borrow=true
spring.datasource.druid.test-on-return=true
spring.datasource.druid.test-while-idle=true
public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALS8ng1XvgHrdOgm4pxrnUdt3sXtu/E8My9KzX8sXlz+mXRZQCop7NVQLne25pXHtZoDYuMh3bzoGj6v5HvvAQ8CAwEAAQ==
选择连接池的考量点
6 spring操作jdbc
6.1 spring操作jdbc的类
- core, JdbcTemplate 等相关核⼼心接⼝口和类
- datasource,数据源相关的辅助类
- object,将基本的 JDBC 操作封装成对象
- support,错误码等其他辅助⼯工具
6.2 spring常用bean
通过注解定义 Bean
- @Component:通用注解定义通用bean
- @Repository:数据操作的仓库
- @Service:业务服务
- @Controller:spring mvc
- @RestController
6.3 常用jdbc操作
JdbcTemplate
• query
• queryForObject
• queryForList
• update
• execute
6.4 sql批处理操作
JdbcTemplate
• batchUpdate
• BatchPreparedStatementSetter
NamedParameterJdbcTemplate
• batchUpdate
• SqlParameterSourceUtils.createBatch
7 spring事务
7.1 spring事务抽象
⼀一致的事务模型
• JDBC/Hibernate/myBatis
• DataSource/JTA
事务抽象的核⼼心接⼝口
默认传播特性
事务传播特性
7.2 编程式事务
ransactionTemplate
• TransactionCallback
• TransactionCallbackWithoutResult
PlatformTransactionManager
• 可以传⼊入TransactionDefinition进⾏行行定义
7.3 声明式事务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5G1DrVnj-1602596507462)(/Users/fwd/Library/Application Support/typora-user-images/image-20201013135347462.png)]
8 spring jdbc异常抽象
Spring 会将数据操作的异常转换为 DataAccessException,⽆无论使⽤用何种数据访问⽅方式,都能使⽤用⼀一样的异常。spring 通过SQLErrorCodeSQLExceptionTranslator 解析错误
ErrorCode 定义
• org/springframework/jdbc/support/sql-error-codes.xml
• Classpath 下的 sql-error-codes.xml
定义错误码解析逻辑如下所示
问题备忘
spring编程式事务和声明式事务?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qo5hASp9-1602596507464)(/Users/fwd/Library/Application Support/typora-user-images/image-20201013134913093.png)]