mysql通俗易懂的數據庫連接池原理及模擬實現


什么是數據庫連接池?

當系統使用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&amp;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技術干貨!

  ▼微信掃一掃下圖↓↓↓二維碼關注

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM