JDBC高级
数据库连接池
数据库连接池的概念
1. 数据库连接的背景
数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出
对数据库连接的管理能显著影响到整个应用程序的性能指标,数据库连接池正是针对这个问题提出来的
2. 数据库连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。这项技术能明显提高对数据库操作的性能
自定义数据库连接池
DataSource
1. DataSource 接口概述
- javax.sql.DataSource接口:数据源(数据库连接池)。Java 官方提供的数据库连接池规范(接口)
- 如果想完成数据库连接池技术,就必须实现DataSource 接口
- 核心功能:获取数据库连接对象:Connection getConnection();
2.自定义数据库连接池
- 定义一个类,实现DataSource 接口
- 定义一个容器,用于保存多个Connection 连接对象
- 定义静态代码块,通过JDBC 工具类获取 10 个连接保存到容器中
- 重写 getConnection 方法,从容器中获取一个连接并返回
- 定义 getSize 方法,用于获取容器的大小并返回
归还连接
规范数据库连接的方式
- 继承方式
- 装饰设计模式
- 适配设计模式
- 动态代理方式
规范连接 - 继承方式
1.继承方式归还数据库连接的思想
- 通过打印连接对象,发现DriverManager 获取的连接实现类是JDBC4Connection
- 那我们就可以自定义一个类,继承JDBC4Connection 这个类,重写 close() 方法,完成连接对象的归还
2. 继承方式归还数据库连接的实现步骤
- 定义一个类,继承JDBC4Connection
- 定义 Connection 连接对象和连接池容器对象的成员变量
- 通过有参构造方法完成对成员变量的赋值
- 重写 close 方法,将连接对象添加到池中
3. 继承方式归还数据库连接存在的问题
- 通过查看 JDBC 工具类获取连接的方法发现:我们虽然自定义了一个子类,完成了归还连接的操作。但是 DriverManager 获取的还是JDBC4Connection 这个对象,并不是我们的子类对象,而我们又不能整体 去修改驱动包中类的功能,所继承这种方式行不通!
归还连接-装饰设计模式
1. 装饰设计模式归还数据库连接的思想
- 我们可以自定义一个类,实现Connection 接口。这样就具备了和JDBC4Connection 相同的行为了
- 重写 close() 方法,完成连接的归还。其余的功能还调用mysql 驱动包实现类原有的方法即可
2. 装饰设计模式归还数据库连接的实现步骤
- 定义一个类,实现Connection 接口
- 定义 Connection 连接对象和连接池容器对象的成员变量
- 通过有参构造方法完成对成员变量的赋值
- 重写 close() 方法,将连接对象添加到池中
- 剩余方法,只需要调用mysql 驱动包的连接对象完成即可
- 在自定义连接池中,将获取的连接对象通过自定义连接对象进行包装
3.装饰设计模式归还数据库连接存在的问题
- 实现 Connection 接口后,有大量的方法需要在自定义类中进行重写
归还连接-适配器设计模式
1. 适配器设计模式归还数据库连接的思想
- 我们可以提供一个适配器类,实现Connection 接口,将所有方法进行实现(除了close方法)
- 自定义连接类只需要继承这个适配器类,重写需要改进的close() 方法即可
2. 适配器设计模式归还数据库连接的实现步骤
- 定义一个适配器类,实现Connection 接口
- 定义 Connection 连接对象的成员变量
- 通过有参构造方法完成对成员变量的赋值
- 重写所有方法(除了close ),调用mysql驱动包的连接对象完成即可
- 定义一个连接类,继承适配器类
- 定义 Connection 连接对象和连接池容器对象的成员变量,并通过有参构造进行赋值
- 重写 close() 方法,完成归还连接
- 在自定义连接池中,将获取的连接对象通过自定义连接对象进行包装
3. 适配器设计模式归还数据库连接存在的问题
- 自定义连接类虽然很简洁了,但适配器类还是我们自己编写的,也比较的麻烦
动态代理
-
动态代理:在不改变目标对象方法的情况下对方法进行增强
-
组成
被代理对象:真实的对象
代理对象:内存中的一个对象 -
要求
代理对象必须和被代理对象实现相同的接口 -
实现
Proxy.newProxyInstance()
归还连接-动态代理方式
1. 动态代理方式归还数据库连接的思想
- 我们可以通过 Proxy 来完成对 Connection 实现类对象的代理
- 代理过程中判断如果执行的是close 方法,就将连接归还池中。如果是其他方法则调用连接对象原来 的功能即可
2. 动态代理方式归还数据库连接的实现步骤
- 定义一个类,实现DataSource 接口
- 定义一个容器,用于保存多个Connection连接对象
- 定义静态代码块,通过JDBC 工具类获取 10 个连接保存到容器中
- 重写 getConnection 方法,