一、如何配置数据源

手动配置所需的Bean

  • 数据源相关:DataSource(根据选择的连接池决定)
  • 事务相关(可选)
    • PlatformTransactionManager(DataSourceTransactionManager)
    • TransactionTemplate
  • 操作相关(可选)

    • JdbcTemplate

    • Spring Boot做了哪些配置

  • DataSourceAutoConfiguration:配置DataSource

  • DataSourceTransactionManagerAutoConfiguration
  • JdbcTemplateAutoConfiguration:配置JdbcTemplate
  • 符合条件时才进行配置

数据源相关配置属性

  1. // 通用
  2. spring.datasource.url=jdbc:mysql//localhost/test
  3. spring.datasource.username=root
  4. spring.datasource.password=password
  5. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  6. // 初始化内嵌数据库
  7. spring.datasource.initialization-mode=embedded|always|never
  8. spring.datasource.schemaspring.datasource.data确定初始化SQL文件
  9. spring.datasource.platform=hsqldb|h2|oracle|mysql|postgresql

二、配置多数据源

不同数据源的配置要分开

关注每次使用的数据源

  • 有多个 DataSource时系统如何判断
  • 对应的设施(事务、ORM等)如何选择DataSource
  • tips:编程时注意关注使用的是那个数据源

    Spring中的多数据源配置

  • 手工配置两组DataSource及相关内容

  • 与Spring Boot协同工作(二选一)
    • 配置@Primary类型的Bean
    • 排除Spring Boot的自动配置
      • DataSourceAutoConfiguration
      • DataSourceTransactionManagerAutoConfiguration
      • JdbcTemplateAutoConfiguration

image.png

三、好用的连接池: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

官方介绍

image.png

Druid的优点

  1. 经过阿里巴巴各大系统的考验
  2. 实用的功能
    • 详细的监控
    • ExceptionSorter,针对主流数据库的返回码都有支持
    • SQL防注入
    • 内置加密配置
    • 众多扩展点,方便进行定制

数据源配置

  1. 需要先排除原来的HikariCP依赖
  2. 直接配置DruidDataSource
  3. 通过druid-spring-boot-starter
    • spring.datasource.druid.*
      image.png
    • 具体配置查看:官方wiki
    • 常见配置
      image.png

      Druid Filter

  • 用于定制连接池操作的各种环节
  • 可以继承FilterEventAdapter以便方便地实现Filter
    image.png
  • 修改resources/META-INF/druid-filter.properties增加FIlter配置

    连接池选择时的考量点

    image.png

六、Spring JDBC

Spring的JDBC操作类,spring-jdbc包

  • core,JdbcTemplate等相关核心接口和类
  • datasource,数据源相关辅助类
  • object,将基本的JDBC操作封装成对象
  • support,错误码等其他辅助工具

    Spring中常用的Bean注解,通过注解定义Bean

  • @Component,用来定义一个通用的Bean

  • @Repository:数据库操作(DAO)
  • @Service:业务服务
  • @Controller:Spring MVC
  • @RestController:Restful WebService

    简单的JDBC操作

  • JdbcTemplate

    • query
    • queryForObject
    • quertForList
    • update
    • execute

      SQL的批处理

  • JdbcTemplate

    • batchUpdate
      • BatchPreparedStatementSetter
  • NamedParameterJdbcTemplate
    • batchUpdate
      • SqlParameterSourceUtils.createBatch

image.png

七、Spring的事务抽象

一致的事务模型

  • JDBC/Hibernate/myBatis
  • DataSource/JTA

    事务抽象的核心接口

  • PlatformTransactionManager

    • DataSourceTransactionManager
    • HibernateTransactionManager
    • JtaTransactionManager
  • TransactionManager
    • Propagation
    • Isolation
    • Timeout
    • Read-only status

      事务传播特性

      image.png

      事务隔离特性

      image.png

编程式事务

  • TransactionTemplate
    • TransactionCallback
    • TransactionCallbackWithoutResult
      image.png
  • PlatformTransactionManager
    • 可以传入TransactionDefinition进行定义

声明式事务

image.png

基于注解的配置方式

image.png

  • 三种情况的例子

    • 第三种在类内部调用insertThenRollback不会回滚

    image.png

八、Spring的JDBC异常抽象

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

  • 无论使用何种数据访问方式,都能使用一样的异常
  • image.png

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

  • 通过SQLErrorCodeSQLExceptionTranslator解析错误码

ErrorCode定义

  • 在这个路径下:org/springframework/jdbc/supports/sql-error-codes.xml
    • 各个数据库都有特定的bean
  • Classpath 下的 sql-error-codes.xml 可以放自定义的去覆盖官方定义的

定制错误码解析逻辑

  • customTranslations

image.png