数据库连接池 Connection Pool 是什么,做什么

来源:互联网 发布:网络通缉犯在逃人员 编辑:程序博客网 时间:2024/05/21 07:46

         重新拾起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 的模拟,但通过此模拟可以对连接池有一定的理解。

1 0