JDBC与数据库连接池
JDBC
- 定义了数据库交互的接口,没有实现
- DriverManager
- Connection
- Statement
- ResultSet
- 后来加上了
- Datasource
- Pool
- Java操作数据库,都可以看作是JDBC上做的增强,比如连接
- 加上XA事务分布式事务 —XAConnection
- 从连接池获取 — PooledConnection
- MySQL驱动JDBC — Connection
数据库连接池
- c3p0
- DBCP(Apache CommonPool)
- Druid
-
ORM
Object-Relational Mapping
-
Hibernate
对JDBC做了轻量的封装
- 将POJO(PlainOrdinaryJavaObject)与数据库表建立映射关系,是一个全自动的ORM框架
- 需要定义实体类和hbm映射文件(IDE自动生成)
- 可以使用HQL、Criteria、NativeSQL三种方式操作数据库
- 优点
- 简单场景不用写SQL
不足
支持定制化SQL、存储过程、高级映射
- 使用XML或注解来配置和映射原生信息,将接口和Java的POJO映射成数据库中的记录
- 使用
- 需要使用映射文件mapper.xml定义map规则和SQL
- 需要定义mapper/DAO,基于xml规则操作数据
- 可以使用工具生成基础的mapper.xml和mapper/DAO
- 推荐继承生成的mapper,而不是覆盖掉防止重新生成mapper导致问题或者直接在mapper上用注解配置SQL
- 优点
- 原生SQL,直观
- 对DBA友好、SQL可控、SQL审计、SQL优化
不足
JavaPersistenceAPI 即Java持久化API
- 是一套基于ORM的规范,内部由一系列的接口和抽象类构成
- 通过JDK5.0的注解描述对象-关系表映射关系,并将运行期的实体对象持久化到数据库中
- 核心是EntityManager
-
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}) //指定多个异常类
```
ORM/JPA
- 默认一个数据源、一套事务管理器,如果多数据源则通过前缀区分开或用shardingsphere动态切换
- 数据库连接池配置
- 大小、不宜过大,通常几十即可
- 重连、保证高可用
- 超时
