一、连接池
1、为什么要连接池?
1、Java程序操作数据库,必须获得一个连接Connection
2、实际操作中,先获得连接,使用完成关闭连接。这两个操作都比较耗时。
3、公用连接,某一个连接在使用时只能给一个人
2、什么是连接池?
定义:一组连接组成的一个池子(集合),称为连接池。
连接池工作原理:
1、连接池有几个连接?初始化值设置
2、如果需要的连接比池子中的多会怎么办?自动创建设置
3、如果新添加连接,一次添加一个?用创建个数设置
4、是否可以无限添加?用最大值设置
5、如果都归还连接?用最小值设置
3、连接池规范
javaEE规范规定,连接池必须实现javax.sql.DataSource
接口中规定方法:getConnection()
常见的第三方连接池
1、C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。hibernate框架底层使用。(等效框架Mybatis)
2、阿里巴巴-德鲁伊druid连接池:Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成。该连接池稳定、性能好。
3、DBCP(DataBase Connection Pool)数据库连接池,是Apache上的一个Java连接池项目,也是Tomcat使用的连接池组件。
4、使用Druid
1、导入jar包
方式1:直接导入jar包
方式2:导入坐标
2、入门案例
1、核心类
2、编写基本参数
3、特殊配置
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
import org.junit.Test;
import java.sql.SQLException;
public class TestDruid {
@Test
public void testDemo() throws SQLException {
//1 获得连接池
//1.1 核心类
DruidDataSource dataSource = new DruidDataSource();
//1.2 基本4项
// 1) 驱动
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
// 2) 连接
dataSource.setUrl("jdbc:mysql://localhost:3306/ssm_db1");
// 3) 用户
dataSource.setUsername("root");
// 4) 密码
dataSource.setPassword("1234");
//1.3 特殊项【可选】
// 1) 初始化大小
dataSource.setInitialSize(5);
// 2) 最大值活动数
dataSource.setMaxActive(10);
// 3) 最小空闲数
dataSource.setMinIdle(2);
//2 从连接池中获得连接
DruidPooledConnection conn = dataSource.getConnection();
System.out.println(conn);
conn.close();
DruidPooledConnection conn2 = dataSource.getConnection();
System.out.println(conn2);
conn2.close();
}
}
二、事务管理
1、事务的作用
保证一组操作要么全都成功,对数据库进行完整更新。要么在某一个动作失败的时候让数据恢复原状,不会引起不完整的修改。
2、事务的特性ACID
1、原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2、一致性(Consistency)事务前后数据的完整性必须保持一致。
3、 隔离性(Isolation)事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
4、 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
3、事务的隔离问题有哪些?
1、脏读:一个事务读到另一个事务没有提交的数据。
2、不可重复读:一个事务读到另一个事务已经提交的数据(update)
3、幻读:一个事务读到另一个事务已经提交的数据(insert)
4、事务的隔离级别有哪些?
1、读未提交 read uncommited:一个事务读到另一个事务没有提交的数据。存在3个问题,解决0个问题
2、读已提交 read commited:一个事务读到另一个事务已经提交的数据。存在2个问题,解决1个问题(脏读)。
3、可重复读 repeatable read:在一个事务中读到的数据重复的。存在1个问题,解决2给我问题(脏读、不可重复读)。
4、串行化 Serializable:单事务。存在0个问题,解决3个问题(脏读、不可重复读、幻读)。
1、隔离级别对比
性能:–read uncommitted > read committed > repeatable read > Serializable
安全:–read uncommitted < read committed < repeatable read < Serializable
2、默认隔离级别
mysql:repeatable read
Oracle:read committed
5、事务的传播行为
1、required必要的:支持当前事务,A有B用,A无B创建
2、supports支持的:支持当前事务,A有B用,A无B非事务执行
3、mandatory强制的:支持当前事务,A有B用,A无B报错
4、required_new必须有一个新的:创建一个新事务,A有B挂起并创建,A无B创建
5、not_supported不支持:不支持当前事务,A有挂起B以非事务执行,A无B以非事务执行
6、never从不:不支持当前事务,A有B报错,A无B非事务执行
7、nested嵌套:嵌套事务,底层使用savepoint进行嵌套事务操作,保存点允许回顾部分事务(不重要)