Spring全家桶学习(3)

前言:

去年九月份我和同事在极客时间上买了 丁雪丰 的Spring 全家桶学习,课程总共分为16章,我已经学了大半部分了,之前是在笔记本上记录,今天我想记录在Blog 上 ,分享更多的知识给有需要帮助的人,我会以章节数来作为文章的内容,原课程讲的更详细,我这里就一些具体的点做一个总结。

一.Spring 的事务抽象

一致的事务模型 

  • JDBC/Hibernate/myBatis
  • DataSource/JRA

 事务抽象的核心接口

PlatformTransactionManager

  • DataSourceTransactionManager
  • HibernateTransactionManager
  • JtaTransactionManager

TransactionDefinition

  • Propagation
  • Islation
  • Timeout
  • Read-only status

 事务传播特性

传播性 描述
PROPAGATION_REQUIDED 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 yes yes yes
ISOLATION_READ_COMMITTED 2 no yes yes
ISOLATION_REPEATABLE_READ 3 no no yes
ISOLATION_SERIALIZABLE 4 no no no

编程式事务 

TransactionTemplate

  • TransactionCallback
  • TransactionCallbackWithoutResult

PlatformTransactionManager

  • 可以传入 TransactionDefinition 进行定义

声明式事务

https://www.cnblogs.com/ooo0/p/11029629.html 


基于注解的配置方式

 开启事务注解的方式:

  • @EnableTransactionManagement
  • <tx:annotation-driven/>

一些配置

  • proxyTargetClass
  • model
  • order

@Transactional

  • transactionManager
  • propagation
  • isolation
  • timeout
  • readOnly
  • 怎么判断回滚

二. Spring 的JDBC 异常抽象

Spring 会将数据操作的异常转换成 DataAccessException

无论使用哪种数据访问方式,都会使用一样的异常

Spring 是怎么认识那些错误码的?

  • 通过SQLErrotCodeSQLExceptionTranslator 解析错误码

ErrorCode 定义

  • org/springframework/jdbc/support/sql-error-codes.xml
  • Classpath下的 sql-error-codes.xml

SpringBoot 定制错误码

三. SpringBoot 常用的注解

可参考:https://blog.csdn.net/tangthh123/article/details/104092510

 四. Actuator

Actuator 提供的一些好用的Endpoint
URL 作用
/actuator/health 健康检查
/actuator/beans 查看容器中的所有Bean
/actuator/mapping 查看Web 的URL 映射
/actuator/env 查看环境信息

解禁所有的 Endpoint

 application.properties 或者 application.yml中  配置参数

management.endpoints.web.exposure.include=*

五. 多数据源.分库分表.读写分离的关系

1.几种常见情况

  • 系统需要访问几个完全不同的数据库,这个时候可以配置俩个数据源
  • 系统需要访问同一个库的主库和备库,也就是要用到读写分离的时候,  一个主库,俩个备库,单独配置数据源,读写实现分离
  • 系统需要访问一组做了分库分表的数据库(垂直拆分  ,水平拆分),尽量用数据库中间件。

六.事务的本质

Spring 的声明式事务本质上是通过AOP 来增强了类的功能。

Spring的 AOP 本质上是为类做了一个代理

  • 看似在调用自己的路诶,实际用的是增强后的代理类

问题的解法:

  • 访问增强后的代理类的方法,而非直接访问自身的方法

七.慢日志的配置

阿里巴巴数据库连接池的一些展开说明:

系统属性配置

  • druid.stat.logSlowSql=true
  • druid.stat.slowSqlMillis=3000

SpringBoot

  • 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
发布了66 篇原创文章 · 获赞 49 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/tangthh123/article/details/105064233