深入分析连接池技术:模拟实现连接池

  • 在上一篇文章中介绍了两种数据库连接池的使用,分别是DBCP和C3P0。也说明了为什么要使用数据库连接池,以及简单的介绍了一下连接池的原理。那么这篇文章就来简单的模拟实现数据库连接池。

模拟实现数据库连接池
连接池类————ConnectionPool
模拟数据库连接池的操作流程:
	1. 创建一个数据库连接池
	2. 初始10个连接对象
	3. 来一个客户端,从连接池里取
	4. 当客户用完了,则不是真的销毁,而是放入到连接池中
public class ConnectPool {
	private static LinkedList<Connection> link = new LinkedList<>();
	//在静态代码快中建立连接池
	static {
		for(int i=0;i<10;i++){
			link.add(DBUtils.getConnection());
		}
	}
	
	public Connection getConnectin(){
		//移除并返回此列表的第一个元素。
		Connection conn = link.removeFirst();
		return conn;
	}
}
  • 之前在介绍原理的时候有说过,数据库连接池是有复用机制的,即使用完之后会放回连接池中,但是资源又必须关闭,所以下面就重点来介绍close( )方法的介绍。
  • 前面所学的DBCP产品,就是遵循了接口DataSource规范,所以我们自定义的连接池也同样要遵循sum公司提出的规范:
    1. 需要实现接口DataSource,我们可以通过前面创建的连接池类去实现该接口;
    2. 之后就是面向Datasource来编程,但是会遇到问题,连接资源怎么关闭?
    3. 装饰模式来帮忙
public class Test {
	
	public static void main(String []args) throws SQLException{
		//遵循DataSource 规范
		DataSource dataSource = new ConnectPool();
		//获取连接池中的连接对象
		Connection conn = dataSource.getConnection();
		//直接关掉
		conn.close();
	}
}
  • 如果我们这样直接使用conn.close( )的话是不会实现回收的。我们的需求是使用完成之后实现回收,而不是关闭。直接使用close( )方法的话是调用Connection接口中的原生方法。所以我们可以使用到包装类,也就是使用到包装模式
装饰设计模式(包装模式)
目的:改写已存在的类的某个方法或某些方法
步骤:
	1,编写一个类ConnectionWrapper,实现与被包装类Connection相同的接口
	2,在类ConnectionWrapper中,定义一个被包装类Connection的类属性
	3,在类ConnectionWrapper中,定义构造方法,把被包装类Connection的对象注入给Connection属性
	4,对于需要改写的方法,写自己的代码
public class ConnectPool implements DataSource {
	//创建一个连接池
	private static LinkedList<Connection> link = new LinkedList<>();
	//初始化十个连接对象
	static{
		for(int i=1;i<11;i++){
			link.add(DBUtils.getConnection());
		}
	}
	
	public Connection getConnection(){
		Connection conn = link.removeFirst();
		//装饰者模式: 
		//传进来原生的对象 得到一个更强大的类,但是最终的实现还是原生的对象来进行实现的
		conn = new ConnectWrapper(link,conn);
		return conn;
	}
}

由于篇幅原因,实现接口之后的重写方法就不贴出来了;

public class ConnectWrapper implements Connection {

	LinkedList<Connection> link = null;
	Connection conn = null;
	
	public ConnectWrapper(LinkedList<Connection> link, Connection conn) {
		this.link = link;
		this.conn = conn;
	}

	@Override
	public void close() throws SQLException {
		System.out.println("连接回收成功...");
		link.addLast(conn);
	}
}	
  • 重点看重写的close( )方法,将传进去的连接池对象添加进去;包括其他重写方法都需要自身去实现才可以正常使用,原理是一致的。
    在这里插入图片描述
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值