JDBC与数据库连接池

JDBC

  • 定义了数据库交互的接口,没有实现
    • DriverManager
    • Connection
    • Statement
    • ResultSet
  • 后来加上了
    • Datasource
    • Pool
  • Java操作数据库,都可以看作是JDBC上做的增强,比如连接
    • 加上XA事务分布式事务 —XAConnection
    • 从连接池获取 — PooledConnection
    • MySQL驱动JDBC — Connection

JDBC.png

数据库连接池

  • c3p0
  • DBCP(Apache CommonPool)
  • Druid
  • Hikari

    ORM

  • Object-Relational Mapping

  • 对象关系映射

    Hibernate

  • 对JDBC做了轻量的封装

  • 将POJO(PlainOrdinaryJavaObject)与数据库表建立映射关系,是一个全自动的ORM框架
  • 需要定义实体类和hbm映射文件(IDE自动生成)
  • 可以使用HQL、Criteria、NativeSQL三种方式操作数据库
  • 优点
    • 简单场景不用写SQL
  • 不足

    • 对DBA不友好,看不见SQL

      MyBatis

  • 支持定制化SQL、存储过程、高级映射

  • 使用XML或注解来配置和映射原生信息,将接口和Java的POJO映射成数据库中的记录
  • 使用
    • 需要使用映射文件mapper.xml定义map规则和SQL
    • 需要定义mapper/DAO,基于xml规则操作数据
    • 可以使用工具生成基础的mapper.xml和mapper/DAO
    • 推荐继承生成的mapper,而不是覆盖掉防止重新生成mapper导致问题或者直接在mapper上用注解配置SQL
  • 优点
    • 原生SQL,直观
    • 对DBA友好、SQL可控、SQL审计、SQL优化
  • 不足

    • 繁琐
    • 可以用MyBatis-generator、MyBatis-Plus之类的插件

      JPA

  • JavaPersistenceAPI 即Java持久化API

  • 是一套基于ORM的规范,内部由一系列的接口和抽象类构成
  • 通过JDK5.0的注解描述对象-关系表映射关系,并将运行期的实体对象持久化到数据库中
  • 核心是EntityManager
  • JPA.png

    Spring集成

    管理事务

  • JDBC层实现的是编程式事务管理

  • Spring实现的是声明式事务管理(事务管理器+AOP) ```java // 事务的传播性 @Transactional(propagation=Propagation.REQUIRED)

// 事务的隔离级别, 读取未提交数据(会出现脏读,不可重复读)基本不使用 @Transactional(isolation=Isolation.READ_UNCOMMITTED)

// 只读,设置当前事务是否为只读事务,默认为false,可读写 @Transactional(readOnly=true)

// 事务的超时 @Transactional(timeout=30)

// 回滚 @Transactional(rollbackFor=RuntimeException.class) //指定单一异常类 @Transactional(rollbackFor={RuntimeException.class,Exception.class}) //指定多个异常类 ``` Spring管理事务.png

ORM/JPA

  • 默认一个数据源、一套事务管理器,如果多数据源则通过前缀区分开或用shardingsphere动态切换
  • 数据库连接池配置
    • 大小、不宜过大,通常几十即可
    • 重连、保证高可用
    • 超时