資料庫連線池設計和實現(Java版本)

堅持╅信念★ 發表於 2020-09-14

微信公眾號:蘇言論
理論聯絡實際,暢言技術與生活。

1 前言

資料庫連線池是目前系統開發必須面對和考慮的問題,原理並不複雜,主要是減少重複連線資料庫的代價;在系統中建立預期數量的資料庫連線,並將這些連線以一個集合或類似生活中的池一樣管理起來,用到的時候直接拿過來使用,用完返回給系統管理;需要注意和主要的難點:
1. 連線池的同步;
2. 連線使用和空閒管理;
3. 連線池滿時的管理和響應。

2 連線池應用場景

  1. 線上系統;
  2. 高併發和多執行緒系統;
  3. 有獨立服務管理資料庫連線的系統,比如中介軟體;

3 設計

20200912-資料庫連線池設計和實現01

ConnectionPool 定義連線池的結構、功能資訊;
PooledConnection 連線池內的連線物件資料結構;
ConnectionPoolImpl 連線池內部結構和實現,建立/關閉/獲取連線;
ConnectionPoolUtil 連線池工具類,對外開放;
DBOperation 資料庫操作(read/write)簡單實現類;

4 開發測試軟體版本

JDK 1.8,MySQL 5.7.30

5 原始碼

https://github.com/LanstonWu/DBConnectionPool

6 使用示例

6.1 定義資料庫連線配置檔案

# 資料庫型別
dbType=MySQL
# 資料庫驅動類
jdbcDriver=com.mysql.jdbc.Driver
# 資料庫url
dbUrl=jdbc:mysql://10.192.168.1:3306/test?useSSL=false
# 資料庫使用者名稱
dbUsername=user01
# 資料庫密碼
[email protected]%
# 初始化資料庫連線
initialConnections=5
# 連線池滿後自動擴充套件連線數
incrementalConnections=5
# 最大資料庫連線
maxConnections=30

6.2 連線池的使用

//獲得資料庫連線池工具類例項
ConnectionPoolUtil pool = ConnectionPoolUtil.getInstance();
//根據db配置檔案初始化連線池
pool.initPool("/tmp/dbConnConfig");

/*
 * 查詢資料
 */
//從連線池中獲得連線
Connection conn = pool.getConnection(); 
DBOperation.read(pool.getConnection(),"select * from partiton_tab_info limit 1",null);
//把連線返回連線池
pool.returnConnection(conn);

/***
 * 條件查詢
 */
//從連線池中獲得連線
conn = pool.getConnection(); 
String[] filt={"dd01","test001"};
DBOperation.read(pool.getConnection(),"select * from partiton_tab_info where dbname=? and tabname=?",filt);
//把連線返回連線池
pool.returnConnection(conn);

/***
 * 插入資料
 */
// 從連線池中獲得連線
conn = pool.getConnection();
String[] insert={"hdfs:/tmp/t001.gz",DateUtil.getCurrentDate("yyyy-MM-dd-HH:mm:ss"),"1"};
DBOperation.write(pool.getConnection(),"insert into flume_hdfs_monitor_detail(path,createdate,status) values(?,?,?)",insert);
//把連線返回連線池
pool.returnConnection(conn);

/***
 * 關閉連線池中所有連線
 */
pool.closeConnectionPool();

測試輸出;

2020-09-12 17:15:16.347 INFO  com.sywu.dao.ConnectionPoolImpl 261 <init> - dbType:MySQL,dbUrl:jdbc:mysql://10.192.168.1:3306/test?useSSL=false,dbUsername:user01,initialConnections:5,incrementalConnections:5,maxConnections:30
2020-09-12 17:15:16.874 INFO  com.sywu.dao.ConnectionPoolImpl 97 createConnections - 資料庫連線:Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45被建立並加入連線池中...
2020-09-12 17:15:16.874 INFO  com.sywu.dao.ConnectionPoolImpl 102 createConnections - 資料庫連線己建立 ....
2020-09-12 17:15:16.950 INFO  com.sywu.dao.ConnectionPoolImpl 97 createConnections - 資料庫連線:Conn_c310ebaa-c880-496e-a4d6-c45a1df51ca8被建立並加入連線池中...
2020-09-12 17:15:16.950 INFO  com.sywu.dao.ConnectionPoolImpl 102 createConnections - 資料庫連線己建立 ....
2020-09-12 17:15:17.016 INFO  com.sywu.dao.ConnectionPoolImpl 97 createConnections - 資料庫連線:Conn_3b209618-1319-4cac-8a88-8571e9dfbc54被建立並加入連線池中...
2020-09-12 17:15:17.016 INFO  com.sywu.dao.ConnectionPoolImpl 102 createConnections - 資料庫連線己建立 ....
2020-09-12 17:15:17.082 INFO  com.sywu.dao.ConnectionPoolImpl 97 createConnections - 資料庫連線:Conn_e163d3b7-50e2-46c0-81ec-ff2d9d3a4f7f被建立並加入連線池中...
2020-09-12 17:15:17.082 INFO  com.sywu.dao.ConnectionPoolImpl 102 createConnections - 資料庫連線己建立 ....
2020-09-12 17:15:17.152 INFO  com.sywu.dao.ConnectionPoolImpl 97 createConnections - 資料庫連線:Conn_313319ac-8a7b-463d-a396-155de18915c0被建立並加入連線池中...
2020-09-12 17:15:17.152 INFO  com.sywu.dao.ConnectionPoolImpl 102 createConnections - 資料庫連線己建立 ....
2020-09-12 17:15:17.153 INFO  com.sywu.dao.ConnectionPoolImpl 323 createPool - 資料庫連線池建立成功... 
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
2020-09-12 17:15:17.182 WARN  com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 連線被使用...
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
2020-09-12 17:15:17.193 WARN  com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_c310ebaa-c880-496e-a4d6-c45a1df51ca8 連線被使用...
row:1,column:1,columnName:dbname,value:testdb01
row:1,column:2,columnName:tabname,value:test_tab01
row:1,column:3,columnName:partspec,value:day
row:1,column:4,columnName:location,value:hdfs://hd01/user/data/test_tab01
2020-09-12 17:15:17.206 INFO  com.sywu.dao.ConnectionPoolImpl 365 returnConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 連線被返回到連線池中...
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
2020-09-12 17:15:17.218 WARN  com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 連線被使用...
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
2020-09-12 17:15:17.229 WARN  com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_3b209618-1319-4cac-8a88-8571e9dfbc54 連線被使用...
row:1,column:1,columnName:dbname,value:testdb01
row:1,column:2,columnName:tabname,value:test_tab01
row:1,column:3,columnName:partspec,value:day
row:1,column:4,columnName:location,value:hdfs://hd01/user/data/test_tab01
2020-09-12 17:15:17.242 INFO  com.sywu.dao.ConnectionPoolImpl 365 returnConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 連線被返回到連線池中...
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
2020-09-12 17:15:17.254 WARN  com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 連線被使用...
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:07.0
2020-09-12 17:15:17.267 WARN  com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_e163d3b7-50e2-46c0-81ec-ff2d9d3a4f7f 連線被使用...
sql:[email protected]: insert into flume_hdfs_monitor_detail(path,createdate,status) values('hdfs:/tmp/t001.gz','2020-09-12-17:15:17','1'),insert or update:1 rows.
2020-09-12 17:15:17.280 INFO  com.sywu.dao.ConnectionPoolImpl 365 returnConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 連線被返回到連線池中...
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:08.0
2020-09-12 17:15:17.292 WARN  com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 連線被使用...
row:1,column:1,columnName:CURRENT_TIMESTAMP(),value:2020-09-12 17:15:08.0
2020-09-12 17:15:17.304 WARN  com.sywu.dao.ConnectionPoolImpl 183 findFreeConnection - Conn_313319ac-8a7b-463d-a396-155de18915c0 連線被使用...
sql:[email protected]: update flume_hdfs_monitor_detail set status='2',closedate='2020-09-12-17:15:17' where path='hdfs:/tmp/t001.gz' and status=1,insert or update:1 rows.
2020-09-12 17:15:17.317 INFO  com.sywu.dao.ConnectionPoolImpl 365 returnConnection - Conn_1a6deeb1-2a97-4307-a2c3-ec99b0970a45 連線被返回到連線池中...
2020-09-12 17:15:17.317 INFO  com.sywu.dao.ConnectionPoolImpl 409 closeConnectionPool - Connection Pools has 5 connections,closing now...
2020-09-12 17:15:27.318 INFO  com.sywu.dao.ConnectionPoolImpl 421 closeConnectionPool - Connection Pools has closed...