为了体现连接池的优势,我们将采用多线程并发访问方式,使得同一个连接在不同的阶段,被不同的线程使用
package demo;
import java.sql.Connection;
public class TestCustomPool {
public static void main(String[] args) {
for(int i=0;i<10;i++){
new MyThread().start();
}
}
}
class MyThread extends Thread{
@Override
public void run() {
try {
//1.获取连接
Connection conn = TestUtils.getConnection();
System.out.println("使用"+conn+","+Thread.currentThread());
//2.释放连接
TestUtils.release(conn);
} catch (Exception e) {
e.printStackTrace();
}
}
}
创建连接和归还连接
package demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
public class TestUtils {
//1.创建容器用于存放连接
private static LinkedList<Connection> pool = new LinkedList<Connection>();
//2.初始化连接池中的连接
static{
try{
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接
for(int i=0;i<3;i++){
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/web08", "root", "root");
//将连接添加到连接池中
//添加的连接被装饰者类包装过的
MyConnection myconn = new MyConnection(conn, pool);
pool.add(myconn);
}
}catch(Exception e){
e.printStackTrace();
}
}
//3.获得连接,从连接池中获得连接
public static Connection getConnection() throws Exception{
//如果池子中有连接
if(!pool.isEmpty()){
//移除获取到的连接
Connection conn = pool.removeFirst();
//返回刚刚获得的连接
return conn;
}else {
//否则程序睡眠100ms,继续获取连接
Thread.sleep(10000);
return getConnection();
}
}
//4.归还连接
public static void release(Connection conn){
if(conn!=null){
try {
conn.close();//不是真的关闭
pool.add(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
使用装饰者设计模式重写Connection的close方法
package demo;
import java.sql.Array;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.NClob;
import java.sql.PreparedStatement;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;
//装饰者设计模式
public class MyConnection implements Connection{
private Connection conn;
private List<Connection> pool;
public MyConnection(Connection conn) {
super();
this.conn = conn;
}
//因为与自定义连接池有关系,需要另外一个构造方法
public MyConnection(Connection conn, List<Connection> pool) {
super();
this.conn = conn;
this.pool = pool;
}
//以下是增强的方法
@Override
public void close() throws SQLException {
//将调用当前close的Connection对象添加到连接池中
System.out.println("连接归还:"+this);
this.pool.add(conn);
}
//其他需要实现的方法
}