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

原创 2016年04月11日 17:08:10

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

相关文章推荐

c3p0、dbcp、tomcat jdbc pool 连接池区别(推荐使用jdbc pool)

查看资料,得知dbcp和c3p0都是单线程的,在高并发的环境下性能会非常低下, 决定换用tomcat自带的jdbc-pool,关于jdbc-pool的项目介绍。 区别参考链接:http://www...

java项目几种常见数据库连接池的使用比较

作者曾经主持以及经历的几个产品及项目中,包括了各种数据库及应用服务器,基本上几种常见的数据库连接池都用到了,根据使用的情况把这些连接池比较一下吧。 感觉在介绍之前有必要阐述一下连接池的几个概念,...

java 定义枚举+枚举使用

package com.yjf.util;      /**   * 枚举列表   *   * @author yijianfeng   * @date 2012-08-17;   */...

JSP+Servlet使用commons.fileupload和commons.io完成图片上传

在jsp+servlet的项目中需要使用图片上传的功能,如果不把图片放在服务器上的话,每次都要从本机取出来,不能达到想要的效果,使用commons.fileupload和commons.io可以完成这...

JDBC----数据库连接池(connection pool)

•数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。 •数据库连接池负责分配、管理...

数据库连接池(connection pool)的工作原理

程序开发,存在很多问题:首先,每一次Web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。这个时间对于一次或几次数据库操作,或许感觉...

数据库连接池DBPool分析(四):mysql连接池 mysql_connection_pool

这个class的设计和MysqlObj不一样了,不会像MysqlObj提供Connect函数来进行连接,这里我直接就在构造函数当中创建好池,因为如果再提供一个init之类的函数来创建池的话我觉得与这个...

数据库连接池DBPool分析(八):redis连接池 redis_connection_pool

更新完上一篇博客的时候恰逢十一黄金周,回家休息了一会。现在补充DBPool的Redis连接池。 我刚开始写mysql_connnection_pool的时候,用的是map这个数据结构来保存连接,每次...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库连接池 Connection Pool 是什么,做什么
举报原因:
原因补充:

(最多只允许输入30个字)