架构师基础篇--数据库之JDBC进阶篇(上)

文章目录

  • JDBC进阶篇
    • 事务
      • 事物的特性(ACID)
      • MySQL处理事务
      • JDBC处理事务
      • 事务并发读问题
      • 四大隔离级别
        • 如何查看和设置数据库的隔离级别
        • 使用JDBC来修改事务隔离级别
    • 数据库连接池
      • 参数
        • 池参数
        • 连接参数
        • 实现的接口
        • c3p0连接池库的配置
      • 对象增强的手段

JDBC进阶篇

事务

银行转账,转和收,两条操作。

事物的特性(ACID)

  • 原子性(Atomicity):事务中所有的操作是不可再分割的原子单位。要么全成功,要么全失败。
  • 一致性(Consistency):事物执行后,数据库状态与其他业务规则保持一致.如转账业务,无论事物执行成功与否,参与转账的两个账号余额之和应该是不变的。其他特性都为这一特性服务。
  • 隔离性(Isolation):隔离性是之在并发操作中,不同事物之间应该隔离开来,使每个并发中大的事物不会相互干扰。
  • 持久性(Durability): 一旦事物提交成功,事务中的所有数据操作都必须持久化到数据库中,即使提交食物后,数据库马上崩溃,在数据库重启时,也必须能通过某种机制恢复数据。

MySQL处理事务

  • start transaction 开启事务
  • rollback 失败结束事务
  • commit 成功结束事务

JDBC处理事务

同一事务中的所有操作都在使用同一个Connection
Connection的三个方法与事务相关

  • 色图AutoCommit(boolean): 设置是否自动提交事务,如果true(default is true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置为false,那么就相当于开启了事务;即 setAutoCommit(false)表示开启事务
  • commit():提交结束事务
  • rollback(): 回滚事务
try {
 	setAutoCommit(false);
 	...
 	...
 	commit();
}catch(){
	roolback();
}

事务并发读问题

  • 脏读: 读取到另一个事务未提交的数据
  • 不可重复读: 两次读取不一致,因为另一事务对该记录对象进行了修改。
  • 幻读(虚读):读到另一个事务已提交的数据。 对同一张表大的两次查询不一致,因为另一事务插入一条新纪录。

四大隔离级别

  1. 串行化(SERIAZABLE)

    • 不会出现任何并发这问题
    • 性能最差容易出现死锁
  2. 可重复(REPEATABLE)(MySQL默认)

    • 防止脏读和不可重复读,不能处理幻读
    • 性能比串行化好
  3. 读已提交数据(Oracle最好)

    • 防止脏读,没有处理不可重复读,也没有处理幻读
    • 性能比可重复读好
  4. 读未提交数据(READ UNCOMMITTED)

    • 可能出现事务并发问题
    • 性能最好

如何查看和设置数据库的隔离级别

  1. 查看隔离级别

MySQL 8.0以前 select @@tx_isolation;
MySQL 8.0 以后 select @@ transaction_isolation

  1. 设置隔离级别

set [global|session] transaction isolation level
[
REPEATABLE READ
| READ COMMITTED
| READ UNCOMMITTED
| SERIALIZABLE
]

使用JDBC来修改事务隔离级别

使用 Connection 对象的setTransactionLevel(int)方法进行设置。

数据库连接池

参数

池参数

  1. 初始化大小
  2. 最小空闲连接数
  3. 增量:一次创建最小单位
  4. 最大空闲连接数
  5. 最大连接数
  6. 最大等待时间

连接参数

  1. 连接池也是用url,username, password等进行连接

实现的接口

  1. 连接池必须实现:javax.sql.DataSource接口

注意:连接池返回大的Connection对象,它的close()方法不是关闭,而是把连接归还给池。

可以使用成熟的库来进行开发

1.Apache commons-dbcp2 这个包依赖于commons-pool2
2.DbUtils方便JDBC的开发。
3. c3p0连接池库

c3p0连接池库的配置

  1. 文件名称:必须是c3p0-config.xml
  2. 文件位置:必须在src下

对象增强的手段

  • 继承
  • 装饰者模式
  • 动态代理

继承 类会爆发性增长
calss Coffee{}
calss AddMilkCoffee extends Coffee{}
class AddSugarCoffee extends Coffee{}
class AddMilkShakeCoffee extends Coffee{}


装饰者模式
Coffee ori = new Coffee()
Coffee a = new AddSugur(ori);
Coffee b = new AddMilk(a)

你可能感兴趣的:(Architecture)