1. 程式人生 > >資料庫連線池 Connection Pool 是什麼,做什麼

資料庫連線池 Connection Pool 是什麼,做什麼

         重新拾起Java來學,就遇到了一本不錯的書《Hibernate 深入淺出》電子工業出版社,相較其他的工具類書,本書中用詞更加生動活潑,從字句之間就可以看出作者的用心與深厚的文字功底,讓人相信,此書值得一看。

        說道資料庫,頭腦中一下子就想到了經典的連線步驟,確實通過JDBC獲取資料庫連線是件再簡單不多的事情,但對於JDBC Driver來說,連線資料庫卻並非一件輕鬆的差事,因為底層它還需要做很多其他事情,那麼它還需要做些什麼呢?

     (1)資料庫連線要在伺服器與資料庫伺服器之間建立一個Socket Connection

     (2)連線建立之後,應用伺服器和資料庫伺服器之間還需要交換若干次資料(驗證使用者密碼、許可權等)

     (3)然後,資料庫開始初始化連線會話控制代碼,記錄聯機日誌,為此連線分配相應的處理程序和系統資源。

      系統如此忙碌,如果我們只是簡單的扔過去兩個SQL語句,然後就將此連線拋棄,是在可惜,而資料庫技術正是為了解決這個問題。

       外部使用者可以通過getConnection方法獲取連線,使用完畢後再通過releaseConnection方法將連線返回,注意此時連線並沒有關閉,而是有連線池管理器回收,併為下一次使用做好準備。下面我們用程式碼簡單模擬一個連線池,主要實現的功能有:

     (1)getConnection方法獲取資料庫連線,如果當前池中有可用連線,則將池中最後一個返回,如果沒有,則新建一個;

     (2)releaseConnection方法將使用完畢的資料庫放回備用池,判斷當前池中連線是否已超過閾值,如果超過,則關閉該連線,否則放回池中以備下次使用。

       好了,下面是模擬程式碼:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Vector;

public class DBConnectionPool implements ConnectionPool{
	
	private static Vector pool;
	private final int POOL_MAX_SIZE=20;
	/*
	 * 獲取資料庫連線
	 * 如果當前池中有可用連線,則將池中最後一個返回,如果沒有,則新建一個
	 */
	public synchronized Connection getConnection() throws BDException {
		
		if(pool == null){
			pool = new Vector();
		}
		Connection conn;
		if(pool.isEmpty()){
			conn=createConnction();
		} else {
			int last_idx = pool.size()-1;
			conn = (Connection) pool.get(last_idx);
			pool.remove(pool.get(last_idx));
		}
		return conn;
	}

	/*
	 * 將使用完畢的資料庫放回備用池
	 * 判斷當前池中連線是否已超過閾值,如果超過,則關閉該連線;
	 * 否則放回池中以備下次使用
	 */
	public synchronized void releaseConnection(Connection conn) {
		
		if(pool.size() > POOL_MAX_SIZE){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			}else{
				pool.add(conn);
		}				
	}
	
	/*
	 * 讀取資料庫連線資訊,並從資料庫連線池中獲取資料庫連線
	 */
	private static Connection createConnction() throws BDException {
		
		Connection conn;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn =
				DriverManager.getConnection(
					"jdbc:oracle:thin:@localhost:1521:oracle",
					"personal","personal");
			return conn;
		} catch (ClassNotFoundException e) {
			throw new DBException{
				"ClassNotFoundException when loading JDBC Driver"
			};
		}catch(SQLException e){
			throw new DBException{
				"SQLException when loading JDBC Driver"
			};
		}
	}
}
        當然這個是及其簡單仍有很多bug 的模擬,但通過此模擬可以對連線池有一定的理解。