SpringBoot做了哪些配置
- 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(与前者对应)
Spring Boot中的多数据源配置
⼿工配置两组 DataSource及相关内容 与 Spring Boot协同工作(二选⼀)
-
配置@Primary类型的Bean(带有@primary注解的bean会被优先选用)
-
排除Spring Boot的自动配置(exclude={DataSourceAutoConfiguration.clss,DataSourceTransactionManagerAutoConfiguration.class,JdbcTemplateAutoConfiguration.class})
-
DataSourceAutoConfiguration
-
DataSourceTransactionManagerAutoConfiguration
-
JdbcTemplateAutoConfiguration
连接池HikariCP
HikariCP 为什什么快
-
字节码级别优化(很多方法通过 JavaAssist 生成)
-
大量小改进
· 用 FastStatementList 代替 ArrayList
· 无锁集合 ConcurrentBag
· 代理类的优化(比如,用 invokestatic 代替了 invokevirtual)
在Springboot中如何配置:
-
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 官网
连接池Alibaba Druid
Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生, 内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置 Logging能诊断Hack应用行为
实用的功能
• 详细的监控(真的是全面)
• 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=
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
•core,JdbcTemplate 等相关核心接口和类
•datasource,数据源相关的辅助类
•object,将基本的 JDBC 操作封装成对象
•support,错误码等其他辅助⼯工具
常用的 Bean 注解
通过注解定义 Bean
•@Component
•@Repository
•@Service
•@Controller
•@RestController
简单的 JDBC 操作
JdbcTemplate :
• query
• queryForObject
• queryForList
• update
• execute
SQL 批处理
JdbcTemplate :
- batchUpdate
- BatchPreparedStatementSetter
NamedParameterJdbcTemplate :
-
batchUpdate
- SqlParameterSourceUtils.createBatch
Spring 的事务抽象
事务抽象的核心接口
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 | 当前有事务就在当前事务里再起一个事务 |
事务隔离特性
隔离性 | 值 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
ISOLATION_READ_UNCOMMITTED | 1 | √ | √ | √ |
ISOLATION_READ_COMMITTED | 2 | × | √ | √ |
ISOLATION_REPEATABLE_READ | 3 | × | × | √ |
ISOLATION_SERIALIZABLE | 4 | × | × | × |
编程式事务
TransactionTemplate
-
TransactionCallback
-
TransactionCallbackWithoutResult
PlatformTransactionManager
-
可以传⼊入TransactionDefinition进行定义
开启事务注解的方式 -
@EnableTransactionManagement
-
<tx:annotation-driven/>
Spring 的 JDBC 异常抽象
- Spring 会将数据操作的异常转换为 DataAccessException
- 无论使用何种数据访问方式,都能使用一样的异常
Spring是怎么认识那些错误码的
-
通过 SQLErrorCodeSQLExceptionTranslator 解析错误码
-
ErrorCode 定义
• org/springframework/jdbc/support/sql-error-codes.xml
• Classpath 下的 sql-error-codes.xml
些常用的注解:
Java的config注解
- @Configuration 表示是一个配置类
- @ImportResource 注入配置以外的一些xml的配置文件
- @ComponentScan 整个spring的容器可以扫描哪一些package下的bean的配置
- @Bean 存在于整个的SpringApplicationContext当中
- @ConfigurationProperties 把配置绑定过来,方便使用
定义相关的注解:
- @Component /@Repository数据访问层的Bean/@Service服务层的Bean
- @Controller/@RestController Web层的Bean
- @RequestMapping 定义是在哪些URL下面做一个映射
注入相关注解
- @Autowired 根据上下文按照类型注入,如果有多个同类型的Bean要配合Qualifier使用/@Qualifier/@Resource 根据名字进行注入
- @Value 在Bean里面注入一些常量或者是我的一些SpEL的表达式,让它找到一些上下问里面配置的一些东西
事务的本质
- Spring 的声明式事务本质上是通过 AOP 来增强了了类的功能
- Spring 的 AOP 本质上就是为类做了一个代理
- 看似在调⽤用自己写的类,实际⽤用的是增强后的代理类
- 问题的解法
- 访问增强后的代理理类的方法,⽽而非直接访问⾃自身的方法
慢 SQL 日志
系统属性配置
• druid.stat.logSlowSql=true
• druid.stat.slowSqlMillis=3000
Spring Boot
• spring.datasource.druid.filter.stat.enabled=true
• spring.datasource.druid.filter.stat.log-slow-sql=true
• spring.datasource.druid.filter.stat.slow-sql-millis=3000
一些注意事项
• 没特殊情况,不不要在⽣生产环境打开监控的 Servlet
• 没有连接泄露露可能的情况下,不不要开启 removeAbandoned
• testXxx 的使⽤用需要注意
• 务必配置合理理的超时时间