1. 程式人生 > 其它 >簡易版JDBC連線池

簡易版JDBC連線池

JDBC連線池mini版的實現

首先是工具類 DbUtil

  • 主要引數就是Driver、User、PWD等啦,主要用於建立連線
  • URL需要注意的是SSL和serverTimezone引數,和mysql驅動版本有關
public class DbUtil {
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC";
    private static final String USER = "root";
    private static final String PWD = "123456";

    public static Connection getConnection(){

        try {
            Class.forName(DRIVER);
            Connection conn = (Connection) DriverManager.getConnection(URL,USER,PWD);
            System.out.println("generate a new connection:"+conn.hashCode());
            return conn;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

DBPool連線池

  • 設定的一個最大容量為20的連線池
  • 使用靜態程式碼塊進行初始化,初始化用到的鎖會在後面繼續介紹
  • 主要包含三個方法,建立連線、擴充連線池和回收連線

public class DBPool {
    private static final int max = 20;
    private static final int min = 5;
    private static int poolSize = 0;

    private DBPool(){}

    private static ConcurrentLinkedQueue<Connection> pool = new ConcurrentLinkedQueue<Connection>();

    static {
        if (poolSize == 0 && pool.isEmpty()){
            synchronized (DBPool.class){
                if (poolSize == 0 && pool.isEmpty()){
                    try {
                        System.out.println("連線池為空,正在初始化");
                        for (int i = 0; i < min; i++) {
                            pool.add(DbUtil.getConnection());
                            poolSize++;
                        }
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static Connection getConnection(){
        try {
            if (!pool.isEmpty()){
                System.out.println("獲得連線");
                return pool.remove();
            }else {
                System.out.println("正在擴大連線池");
                dilatation(5);
                System.out.println("正在獲得連線");
                while (true){
                    if (!pool.isEmpty()){
                        System.out.println("獲得連線");
                        return pool.remove();
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

    public static void dilatation(int num){
        if (poolSize > max){
            System.out.println("超過連線池最大數量");
            return;
        }
        for (int i = 0; i < num; i++) {
            pool.add(DbUtil.getConnection());
            poolSize++;
        }
    }

    public static void close(Connection conn){
        pool.add(conn);
        System.out.println("回收成功");
    }
}

JDBCTest測試類


public class JDBCTest {
    public static void main(String[] args) {
        Connection c1 = DBPool.getConnection();
        DBPool.close(c1);
        System.out.println("該連線為:"+c1.hashCode());

       for (int i = 0; i < 20; i++) {
            System.out.println("連線"+i+" :"+DBPool.getConnection());
        }
    }
}