自定义连接池

为了体现连接池的优势,我们将采用多线程并发访问方式,使得同一个连接在不同的阶段,被不同的线程使用

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);
    }

    //其他需要实现的方法
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值