数据库连接池
概念:数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个 。
模拟实现数据库连接池
模拟实现数据库连接池
import com.qianfeng.DBUtil;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;
public class FastConnectionPool {
//存储连接的容器
private static LinkedList<Connection> list=new LinkedList<>();
static {
//初始化连接容器
for (int i = 0; i < 20; i++) {
try {
list.add(DBUtil.getConnection());
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static Connection getConnection(){
return list.removeFirst();
}
public static void recovery(Connection connection){
list.add(connection);
}
}
连接池规范
DataSource
连接池各有各的实现方式,所以sun公司定义了一个标准,DataSource
接口DataSource
1. 所以上述我们实现的连接要符合sun公司的规范,就需要实现接口DataSource,所以我们可以编写一个MyDataSource类
2. 之后就是面向Datasource来编程,但是会遇到问题,连接资源怎么关闭?
3. 装饰模式来帮忙
使用过程,重点是要实现close方法
装饰设计模式(包装模式)
目的:改写已存在的类的某个方法或某些方法
步骤:
1,编写一个类A,实现与被包装类相同的接口(具备相同行为)
2,在类A中,定义一个被包装类的类型对象
3,在类A中,定义构造方法,把被包装类的对象注入,给被包装类变量赋值
4,对于不需要改写的方法,调用原有的方法
5,对于需要改写的方法,写自己的代码
编写一个MyConnection 实现 Connection
定义Connection conn对象
定义LinkedList<Connection> pool;
通过构造方法对上述两个值进行初始化
Public MyConnection(Connection conn, LinkedList<Connection> pool){
//....
}
重写close方法
Public void close(){
pool.addLast(conn);
}
//所以在我们编写的Datasource里面,获取连接的方法需要将原本的conn对象进行包装
LinkedList<Connection> pool = new LinkedList<Connection>();//数据源内部包含的一个连接池
Public Connection getConnection(){
Connection conn = DBUtils.getConnection();
MyConnection mc = new MyConnection(conn,pool);
return mc;
}
public class MyConnectionPool implements DataSource {
private static LinkedList<Connection> list=new LinkedList<>();
static {
for (int i = 0; i < 20; i++) {
try {
list.add(new MyConnection(DBUtil.getConnection(),list));
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@Override
public Connection getConnection() throws SQLException {
return list.removeFirst();
}
@Override
public void close() throws SQLException {
//将连接对象回收到连接池中
list.add(this);
}
德鲁伊连接池
Druid 是目前比较流行的高性能的,它有如下几个特点:
一. 亚秒级查询
druid提供了快速的聚合能力以及亚秒级的查询能力,多租户的设计,是面向用户分析应用的理想方式。
二.实时数据注入
druid支持流数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性
三.可扩展的PB级存储
druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即便在加大数据规模的情况下,也能保证时其效性
四.多环境部署
druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop,spark,kafka,storm和samza等
五.丰富的社区
druid拥有丰富的社区,供大家学习