資料庫連線池 Connection Pool 是什麼,做什麼
重新拾起Java來學,就遇到了一本不錯的書《Hibernate 深入淺出》電子工業出版社,相較其他的工具類書,本書中用詞更加生動活潑,從字句之間就可以看出作者的用心與深厚的文字功底,讓人相信,此書值得一看。
說道資料庫,頭腦中一下子就想到了經典的連線步驟,確實通過JDBC獲取資料庫連線是件再簡單不多的事情,但對於JDBC Driver來說,連線資料庫卻並非一件輕鬆的差事,因為底層它還需要做很多其他事情,那麼它還需要做些什麼呢?
(1)資料庫連線要在伺服器與資料庫伺服器之間建立一個Socket Connection
(2)連線建立之後,應用伺服器和資料庫伺服器之間還需要交換若干次資料(驗證使用者密碼、許可權等)
(3)然後,資料庫開始初始化連線會話控制代碼,記錄聯機日誌,為此連線分配相應的處理程序和系統資源。
系統如此忙碌,如果我們只是簡單的扔過去兩個SQL語句,然後就將此連線拋棄,是在可惜,而資料庫技術正是為了解決這個問題。
外部使用者可以通過getConnection方法獲取連線,使用完畢後再通過releaseConnection方法將連線返回,注意此時連線並沒有關閉,而是有連線池管理器回收,併為下一次使用做好準備。下面我們用程式碼簡單模擬一個連線池,主要實現的功能有:
(1)getConnection方法獲取資料庫連線,如果當前池中有可用連線,則將池中最後一個返回,如果沒有,則新建一個;
(2)releaseConnection方法將使用完畢的資料庫放回備用池,判斷當前池中連線是否已超過閾值,如果超過,則關閉該連線,否則放回池中以備下次使用。
好了,下面是模擬程式碼:
當然這個是及其簡單仍有很多bug 的模擬,但通過此模擬可以對連線池有一定的理解。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" }; } } }