簡易版JDBC連線池
阿新 • • 發佈:2021-06-26
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()); } } }