什么是數據庫連接池?
當系統使用JDBC技術訪問數據庫時會創建一個connection對象,而該對象的創建過程是非常消耗資源的,並且創建對象的時間也特別長,假設系統一天有1萬次的訪問量,那么一天就會有1萬個connection對象被創建,這極大的浪費數據庫的資源,而且可能造成數據庫服務器內存溢出,宕機。
為了解決以上問題,就引入了數據庫連接池,它主要用來分配、管理、釋放數據庫的連接。系統啟動的時候,數據庫連接池首先會創建若干個(該數量可配置)connection對象,並將這些對象放入池中,當系統需要connection對象時,
數據庫連接池會從池中分配一個事先創建好的connection對象給系統,當系統使用完畢或超時后,數據庫連接池會將該connection對象重新放入池中。
這樣就減少了創建connection對象所耗費的資源和時間,可以提高數據庫操作的性能。
下圖為數據庫連接池原理圖:
模擬編寫一個數據庫連接池
因為要用到數據庫,所以需要將之前編寫的JDBC相關的代碼和jar包拷貝過來,創建一個SimpleConnectionPool類,里面需要實現下面三個功能:
1. 初始化一個數據庫連接池,並向里面添加10個數據庫連接;
2. 從連接池中獲取連接;
3. 當程序用完連接后,需要將該連接重新放入連接池中。
需要注意:數據庫連接池要保證線程安全!
/** * 1. 初始化一個數據庫連接池,並向里面添加10個數據庫連接; * 2. 從連接池中獲取連接; * 3. 當程序用完連接后,需要將該連接重新放入連接池中。 */ public class SimpleConnectionPool { //創建一個存放連接的池子,注意要保證線程安全 //因為要頻繁的對數據庫連接池取出和存放操作,所以使用LinkedList池子 public static LinkedList<Connection> pool = (LinkedList<Connection>) Collections.synchronizedList(new LinkedList<Connection>()); //在類加載后向數據庫連接池中存放10個數據庫連接 static { try { for (int i = 0; i < 10; i++) { Connection con = DBUtil.getConnection(); pool.add(con); } } catch (SQLException e) { e.printStackTrace(); } } //從連接池中獲取連接 public static Connection getConnectionFromPool(){ Connection con = null; //判斷池子中是否還有連接對象 if(pool.size()>0){ con = pool.removeFirst(); }else{ //此時說明數據庫連接池中沒有可用的連接了 throw new RuntimeException("服務器忙,請稍后再試"); } return con; } //當程序用完連接后,需要將該連接重新放入連接池中 public static void release(Connection con){ pool.addLast(con); } }
public class DBUtil { private static String driverClass="com.mysql.jdbc.Driver"; private static String url="jdbc:mysql://127.0.0.1:3306/map?useUnicode=true&characterEncoding=utf-8"; private static String userName="root"; private static String password="root"; static{ try { //加載驅動 Class.forName(driverClass); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static Connection getConnection() throws SQLException{ return DriverManager.getConnection(url, userName, password); } }
歡迎關注微信公眾號【Java典籍】,收看更多Java技術干貨!
▼微信掃一掃下圖↓↓↓二維碼關注