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

学习DatabaseConnectionPool--数据库连接池(随记二)

 一、从java类来分析连接池的构架,可以了解以下几点: 1. 连接池实际上分2个部分:连接池类和连接池管理类。  2. 连接池类作用是:创建和毁灭连接池、创建连接和关闭连接、遍历查询并提供有效连接、...
  • achan2090
  • achan2090
  • 2007年05月28日 23:01
  • 2410

Connection Pool

遇到这个错误: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。 问题描述:我们获取连接超过连接池最大值时产生如上异常。...
  • felixfeng
  • felixfeng
  • 2011年10月19日 16:41
  • 425

java开发中ConnectionPool 连接不同数据库的实现

在JAVA开发中,有时候会遇到要连接多个不同的数据库,可能一个是SQLSERVER, 另一个是Vertica. 那么我们怎么在一个ConnectionPool工具类中实现连接不同的数据库呢? 下面是代...
  • zhanglc_5168
  • zhanglc_5168
  • 2015年02月02日 16:26
  • 1609

okhttp ConnectionPool使用例子

okhttp ConnectionPool使用例子
  • jacke121
  • jacke121
  • 2017年03月26日 11:01
  • 1601

Okhttp之连接池ConnectionPool简单分析(一)

ConnectionPool
  • chunqiuwei
  • chunqiuwei
  • 2017年07月05日 23:07
  • 1247

数据库连接异常Cannot get a connection, pool error Timeout waiting for idle object

数据库连接池无法获取连接,连接池等待空闲对象超时错误,Cannot get a connection, pool error Timeout waiting for idle object...
  • qq_35952082
  • qq_35952082
  • 2016年09月26日 18:04
  • 2615

Python HTTPConnectionPool [Errno 11004]

由于需要进行一些文章的抓取,我开了一个多进程的Pool,相信大家这个应该是了解的,可是后面遇见了两种问题,题目所描述的只是我认为比较重要的一点。第一种HTTPConnectionPool[Errno ...
  • cwl19940125
  • cwl19940125
  • 2017年09月13日 15:59
  • 324

Oracle JDBC2.0 数据来源(Data Source)与连接池(Connection Pool)

原先倒是可以用JSP写出来小型的数据库应用程序,不满足单单掌握JSP,因为我写的时候一直看不到java 完整源代码,所以很郁闷,呵呵.修改的时候也比较烦,Servlet 也是,out.println(...
  • sylmoon
  • sylmoon
  • 2005年02月03日 16:37
  • 4050

nodejs解决mysql和连接池(pool)自动断开问题

最近在做一个个人项目,数据库尝试使用了mongodb、sqlite和mysql。分享一下关于mysql的连接池用法。项目部署于appfog,项目中我使用连接池链接数据库,本地测试一切正常。上线以后,经...
  • liuxiao723846
  • liuxiao723846
  • 2015年07月01日 18:32
  • 5160

数据库连接池的理解和使用

一、什么是数据库连接池? 官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。 ...
  • wenwen091100304
  • wenwen091100304
  • 2015年08月27日 20:49
  • 35676
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库连接池 Connection Pool 是什么,做什么
举报原因:
原因补充:

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