创建数据库连接池?
- 使用LinkedLIst进行创建,因为增删快
- 创建静态代码块中创建规定个数的数据连接池
- 创建get方法得到一个连接池
- 创建back方法返还一个连接池
- 创建size方法得到连接池现在的数量
package com.wei.dataSource;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.LinkedList;
public class HeiMaDataSource {
//1. 定义容器,保存连接对象
private static LinkedList<Connection> pool = new LinkedList<Connection>();
//2. 使用静态代码块,往容器 pool 里面装5个连接对象
static{
try {
//1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/day18?useSSL=false";
String username = "root";
String password = "root";
//2. 获取连接,往容器里面装
for (int i = 0; i < 5; i++) {
Connection conn = DriverManager.getConnection(url, username, password);
//往容器里面装连接对象
pool.addLast(conn);
}
} catch (Exception throwables) {
throwables.printStackTrace();
}
}
//3. 对外提供方法,供其他类|方法 获取连接
public static Connection getConn(){
//从容器里面获取连接对象, 返回连接对象
Connection conn = pool.removeFirst();
return conn;
}
//4. 对外提供方法,供其他类|方法 归还连接
public static void back(Connection conn){
//把连接装到容器里面去
pool.addLast(conn);
}
//5. 对外提供方法 , 供其他类|方法 查看连接数
public static int size(){
return pool.size();
}
}
使用相同的方法进行连接对象的归还?
为什么要使用close的代替对象,避免自定义的名字实现与大多数的连接池名字不同功能相同的现象。在上述的基础上get方法建立对应的代理对象对我们所需要的得到一个对象的方法进行增强。这样的话我们可以做到不改变其余连接池方法名的基础上实现相同的功能。
public static Connection get(){
Connection conn=PrepareStatement.getConnection();
Proxy.new ProxyInstance(conn类加载器,conn接口,new InvocationHandler(){ @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object o = null;
if(method.getName().equals("close")){
//改造这个方法。
pool.addLast(conn);
}else{
//传入的方法名用真实对象的方法即可
o = method.invoke(conn , args);
}
return o;
}
});
}