版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39531549/article/details/82764358
一、连接池概述
1、连接池的概述
* 之前得到数据库连接 DriverManager.getConnection();
- 每个用户连接都需要执行一次这个方法
* 比如 每次创建连接需要0.1秒,关闭连接需要0.1,如果一个访问需要0.2秒
- 比如现在有10万个人,有十万次连接和关闭,要花费20000秒,时间很长会造成服务器的压力会很大很大
* 可以使用连接池解决这个问题
* 什么是连接池:预先创建一些连接,放到内存中的一个空间里面。每次用户访问时候,从内存空间里面获取一个连接,用完之后,不进行关闭,放回内存的空间里面,供其他用户使用。避免频繁的创建和关闭。在内存中的空间理解为是一个容器,容器里面放的数据库的连接
* 自定义连接池(了解)
- 实现步骤:
-- 第一步:创建一个类实现一个接口 DataSource
-- 第二步:实现接口里面的方法,主要实现getConnection()
* 创建数据库连接 DriverManager.getConnection()
* 创建多个连接 for循环
* 在内存中分配一个空间 List集合,把创建的多个连接放到集合里面
* 把创建的多个连接放到集合里面 使用list里面add方法
* 从list集合里面获取连接 remove方法取出去连接
- list.remove(0)
* 开源的连接池
- DBCP连接池(会用)
- C3P0连接池(一般企业中的都使用这个连接池)
- Tomcat内置的连接池(了解)
==============================================================================================================
二、自定义连接池
2、自定义连接池
* 实现步骤:
- 第一步:创建一个类实现一个接口 DataSource
- 第二步:实现接口里面的方法,主要实现getConnection()
-- 创建数据库连接 DriverManager.getConnection()
-- 创建多个连接 for循环
-- 在内存中分配一个空间 List集合,把创建的多个连接放到集合里面
-- 把创建的多个连接放到集合里面 使用list里面add方法
-- 从list集合里面获取连接 remove方法取出去连接
* list.remove(0)
*代码演示
-mypool.java类实现DataSource接口
public class MyPool implements DataSource {
List<Connection> list = new ArrayList<Connection>();
Connection conn = null;
public MyPool(){
//创建对象,创建连接池
for(int i=1;i<10;i++){
try {
conn = JDBCUtils.getConnection();
list.add(conn);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//把使用完的连接放回连接池里面
public void backPool(Connection conn){
list.add(conn);
}
public Connection getConnection() throws SQLException {
if(list.size()<0){
//创建对象,创建连接池
for(int i=1;i<10;i++){
try {
conn = JDBCUtils.getConnection();
list.add(conn);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return list.remove(0);
}
-测试类
public class TestPool {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pst = null;
// 获取连接池对象
MyPool myPool = new MyPool();
try {
// 获取连接
conn = myPool.getConnection();
// 编写sql
String sql = "select * from account";
pst = conn.prepareStatement(sql);
ResultSet executeQuery = pst.executeQuery();
while (executeQuery.next()) {
int id = executeQuery.getInt(1);
String name = executeQuery.getString(2);
int salay = executeQuery.getInt(3);
System.out.println(id + " " + name + " " + salay);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
JDBCUtils.releaseResource(conn, pst);
// 放回connection
myPool.backPool(conn);
}
}
}
==============================================================================================================
三、增强一个类中的方法
*如何增强一个类中的方法
* 增强一个类中的方法有三种
① 第一种继承
* 使用继承方式增强类中的方法,必须要知道父类是什么,得到父类
class Man {
public void run1() {
System.out.println("man run...........");
}
}
class SuperMan extends Man {
public void run1() {
// super.run1();
System.out.println("superman run...........");
}
}
② 第二种装饰者模式
* 首先创建一个接口,在接口里面定义方法
* 写两个类,这两个类分别实现这个接口
* 在增强的方法所在的类里面,得到被增强方法所在类的引用
* 缺点:由于实现接口,所有需要把接口里面的所有的方法都实现
* 代码
interface Bird {
public void fly() ;
}
//增强ying类里面的fly的方法
//创建两个类,分别实现这个接口
class Ying implements Bird {
public void fly() { //被增强的方法
System.out.println("ying fly 1000 m..............");
}
}
class Diao implements Bird {
private Bird bird;
//通过构造得到
public Diao(Bird bird) {
this.bird = bird;
}
public void fly() { //增强的方法
// bird.fly();
System.out.println("diao fly 9m");
}
}
调用:
Diao diao = new Diao(new Ying());
diao.fly();
③ 第三种动态代理
==============================================================================================================
四、增强Connection里面close方法
4、实现增强Connection里面的close方法
* 实现的是把close方法实现的功能不是关闭连接,而是把连接放回list集合里面
* 步骤
- 第一步:创建一个类,实现Connection接口
- 第二步:增强close方法
** 通过构造得到conn和list结合
** 代码
private List<Connection> list;
private Connection conn;
//实现把连接放回到list里面
//通过构造
public MyClose(Connection conn,List<Connection> list) {
this.list = list;
this.conn = conn;
}
* 把conn放到list里面
* 代码
public void close() throws SQLException {
//把conn放到list里面
list.add(conn);
}
- 第三步:由于实现Connection接口,但是现在只是增强close方法,其他的方法需要保留原有的逻辑
public Statement createStatement() throws SQLException {
// TODO Auto-generated method stub
return conn.createStatement();
}
- 第四步:在自定义连接池类里面,使用增强的类
* 在获取连接的方法里面 getConnection方法里面,new 创建的增强的类,把conn和list集合传递进去,
返回new 的连接
conn = list.remove(0);
MyClose myclose = new MyClose(conn, list);
return myclose;
- 第五步:使用多态形式,使用自定义的连接池,执行conn里面的close方法不是关闭连接了,而是把连接放到list里面
DataSource pool = new MyPool();
==============================================================================================================