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

阅读更多
文章标签: Java 数据库
个人分类: java 数据库
想对作者说点什么? 我来说一句

ConnectionPool

2008年07月28日 55KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭