`
lancelot_WT
  • 浏览: 4612 次
  • 性别: Icon_minigender_1
  • 来自: 丽江
文章分类
社区版块
存档分类
最新评论

DBCP——数据库连接池理解

阅读更多

       随着Internet的发展B/S的三层结构逐渐取代了C/S的两层结构,在WEB中运用越来越广泛。其中JDBC( Java DataBase Connction)是连接Java程序与数据库的桥梁,让程序员可以在Java代码里就可以进行数据库的操作。

一般来说在java里进行数据库的操作主要有以下几个步骤:

(1)装载数据库驱动;

(2)通过JDBC连接数据库;

(3)访问数据库,执行sql语句;

(4)断开数据库连接。

每进行一次数据库访问的操作就要进行数据库的连接操作,这是比较耗费时间的一步,

每次连接操作都大约耗时0.5s——1s。在进行少量的数据库操作时这样的速度还能接受,但是在WEB应用中,面对的是几百几千甚至上万的用户,每个用户连接一次数据库都要耗时这么多,显然不能让人接受,所以需要对数据库连接进行有效管理,DBCP(DataBase Conntion Pool)便应运而生。

DBCP的基本思想就是在虚拟的“池”中先放入一些建立好的连接像,当要进行数据库访

问时,直接从“池”中拿出连接来使用,而不是去创建一个连接对象,当访问完成时又放回到“池”中,这样便节省了数据库连接的时间。DBCP的模型由一个连接池类和一个连接池管理类构成,示例如下:

package cn.wutong.DBCP;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 * 数据库连接池类
 * @author 吴同
 *
 */
public class DBConnectionPool {
	 private int inUsed=0;    //使用的连接数
	 private String poolName;//连接池的名字
	 private ArrayList<Connection> freeConnections = new ArrayList();//容器,空闲连接
	 //private int minConn;     //最小连接数
	 private int maxConn;     //最大连接
	 private String password; //密码
	 private String url;      //数据库连接地址
	 private String driver;   //驱动
	 private String userName;     //用户名
	 public DBConnectionPool(String url,String driver,String userName,String password){
		 this.url=url;
		 this.driver=driver;
		 this.userName=userName;
		 this.password=password;
	 }//创建对象时可以输入其数据库连接的参数
	 public int getInUsed() {
		return inUsed;
	}
	 //得到所有的空闲连接
	public ArrayList getFreeConnections() {
		return freeConnections;
	}
	public void setPoolName(String poolName) {
		this.poolName = poolName;
	}
	public String getPoolName(){
		return this.poolName;
	}
//	public int getMinConn() {
//		return minConn;
//	}
//	public void setMinConn(int minConn) {
//		this.minConn = minConn;
//	}
	public int getMaxConn() {
		return maxConn;
	}
	public void setMaxConn(int maxConn) {
		this.maxConn = maxConn;
	}
//创建连接,内部方法,不能在外部调用
	private  Connection creatConnection(){
		Connection conn=null;
	try {
		Class.forName(driver);
		try {
		conn=DriverManager.getConnection(url, userName, password);
		System.out.println("DBConnectionPool-->creatConnection()-->创建了一个数据库连接");
		} catch (SQLException e) {
			System.out.println("DBConnectionPool-->creatConnection()-->数据库连接错误");
			e.printStackTrace();
		}
	} catch (ClassNotFoundException e) {
		System.out.println("没有找到这种数据库的驱动");
		e.printStackTrace();
	}
	return conn;
}
	//得到连接的方法
	public synchronized  Connection getConnention(){
		Connection conn=null;
		if(maxConn>inUsed){
			if(this.freeConnections.size()>0){
				conn=this.freeConnections.get(0);//已经创建过连接,直接从空闲连接队列里得到
				freeConnections.remove(0);//从空闲连接队列中去除
				System.out.println("DBConnectionPool-->getConnention()-->从空闲连接中得到一个连接");
				if(conn==null){//如果得到的是空则说明所有创建的连接都已被用了
					System.out.println("DBConnectionPool-->getConnention()-->得到的连接为空重新得到");
					conn=getConnention();// 重新得到连接
				}
			}else{//如果没有创建过连接则创建一个
				conn=creatConnection();
			}
		}
		if(conn!=null){
			inUsed++;
			System.out.println("DBConnectionPool-->getConnention()-->得到了连接对象");
		}else{
			System.out.println("DBConnectionPool-->getConnention()-->超过连接范围,没有得到连接对象");
		}
		return conn;
	}
	//释放一个连接
	public synchronized void freeConnection(Connection conn){
		freeConnections.add(conn);
		inUsed--;
		}
	//释放所有连接
	public synchronized void realseAllConnections(){
		java.util.Iterator iter=this.freeConnections.iterator();
		while(iter.hasNext()){
			Connection conn=(Connection)iter.next();
			try {
				conn.close();
			} catch (SQLException e) {
				System.out.println("DBConnectionPool-->realseAllConnections()-->连接关闭错误");
				e.printStackTrace();
			}
		}
		freeConnections.clear();//空闲连接队列清空
	}
}

 

package cn.wutong.DBCP;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;

/**
 * 数据连接池管理类
 * @author 吴同
 *
 */
public class DBConnectionManager {
	private static DBConnectionManager instance;//唯一的数据连接管理对象
	 private static int clients;//客户数量
	private ArrayList drivers = new ArrayList();//容器,存放数据库驱动程序
	private HashMap<String,DBConnectionPool> pools = new HashMap ();//以name/value的形式存取连接池对象的名字及连接池对象
	private DBConnectionManager(){
		init();
	}//私有构造函数,在其中调用初始化函数init()
	//如果唯一的实例instance已经创建,直接返回这个实例;否则,调用私有构造函数,创建连接池管理类的唯一实例
	public static synchronized  DBConnectionManager getInstance(){
		if(instance==null){
			instance=new DBConnectionManager();
		}
		System.out.println("DBConnectionManager->getInstance()->得到了数据连接吃管理对象");
		return instance;
	}
	// 释放一个连接,name是一个连接池对象的名字
	public void freeConnection(String poolName, Connection con){
		DBConnectionPool pool=pools.get(poolName);
		if(pool!=null){
			pool.freeConnection(con);
			System.out.println("DBConnectionManager->freeConnection()->释放了"+poolName+"中的一个连接");
		}else{
			System.out.println("DBConnectionManager->freeConnection()->没有这个连接池");
		}
	}
	//从名字为name的连接池对象中得到一个连接
	 public Connection getConnection(String poolName){
		 Connection con=null;
		 DBConnectionPool pool=pools.get(poolName);
		 if(pool!=null){
			 con=pool.getConnention();
	 }else{
		 System.out.println("DBConnectionManager->getConnection()->没有这个连接池");
	 }
		 if(con==null){
			 System.out.println("DBConnectionManager->getConnection()->没有得到连接对象");
		 }else  System.out.println("DBConnectionManager->getConnection()->得到了连接对象");
		return con;
	 }
	//从名字为name的连接池对象中取得一个连接,time是等待时间
	//public Connection getConnection(String name, long time){}
	//释放所有资源
	public synchronized void release(){
	java.util.Set keySet=pools.keySet();
	java.util.Iterator iter=keySet.iterator();
	while(iter.hasNext()){
		DBConnectionPool pool=pools.get(iter.next());
		pool.realseAllConnections();
	}
	pools.clear();
	System.out.println("DBConnectionManager->release()->释放了所有连接池");
	}
	//创建一个连接池
	private void createPools(String url,String driver,String userName,String password,int maxConn,String poolName){
		DBConnectionPool pool=new DBConnectionPool(url,driver,userName,password);
		pool.setMaxConn(maxConn);
		pool.setPoolName(poolName);
		pools.put(poolName, pool);
		System.out.println("DBConnectionManager->createPools()->创建了一个"+poolName+"的连接池");
	}
	//初始化连接池管理类的唯一实例,由私有构造函数调用
	private void init(){}
	//装载驱动
	private void loadDriver(){}
}

 

 

 

 在WEB中使用时,在一个servlet初始化时(init方法被调用)时得到数据库连接池管理对象,在service方法中使用数

据库连接池,进行数据库操作,在destroy方法中释放所有资源。

本篇文章只是一个DBCP的示例,还有许多可以完善的地方,如用计时器记录连接池的时间,设置超时时限等等。

分享到:
评论

相关推荐

    DBCP的数据库连接池需要用的包 commons-dbcp commons-pool-current

    总的来说,DBCP和Commons Pool是Java应用中实现数据库连接池的重要工具,它们能够有效地管理数据库连接,提升应用的并发性能和资源利用率。在实际开发中,正确配置和使用这两个组件对于优化数据库操作和提高应用整体...

    dbcp建立数据库连接池的功能所需要的两个jar包

    DBCP(Jakarta Commons DBCP)是Apache软件基金会提供的一个开源数据库连接池实现,它基于Apache的Commons Pool对象池实现。在本话题中,我们将深入探讨DBCP如何工作以及如何配置这两个关键的jar包——`commons-pool...

    jsp毕业设计——JSP数据库连接池的研究与实现(源代码+论文).zip

    本项目“JSP毕业设计——JSP数据库连接池的研究与实现”显然聚焦于如何高效地管理和使用数据库资源,特别是通过数据库连接池来优化性能。 数据库连接池是现代Web应用中一个关键的组件,它的核心功能是管理数据库...

    几种数据库连接池详细配置

    本文将深入解析几种常用的数据库连接池——Apache DBCP、C3P0、Proxool、BoneCP的详细配置参数,帮助开发者更好地理解和应用这些技术。 ### Apache DBCP **dataSource**: 配置数据源,通常在应用服务器的配置文件...

    数据库连接池相关 jar 包

    在给定的标题和描述中,我们聚焦于两个关键的库——`commons-dbcp.jar`和`commons-pool.jar`,它们是Apache Commons项目的一部分,用于实现数据库连接池功能。 `commons-dbcp`(Database Connection Pool)是Apache...

    数据库连接池——JDBC通过代理模式来保持用户关闭连接的习惯

    本文将详细解析“数据库连接池——JDBC通过代理模式来保持用户关闭连接的习惯”这一主题,并以`MyConnectionHandler.java`作为示例代码进行讲解。 首先,我们需要了解数据库连接池的基本概念。数据库连接池,又称为...

    apache数据库连接池JAR包

    Apache Commons DBCP(Database Connection Pool)是一个开源的Java数据库连接池组件,它提供了一种在Java应用中管理和复用数据库连接的方式。这个组件是Apache软件基金会 Commons项目的一部分,其设计目的是提高...

    简单建立数据库连接池及JDK自带日志使用(真正)

    在Java中,我们可以使用多种库来创建数据库连接池,如C3P0、DBCP、HikariCP等。本示例将重点讨论如何使用JDBC API和JDK自带的日志系统进行简单的数据库连接池配置。 首先,数据库连接池的基本工作原理是预先创建...

    DBCP jar包 连接数据库必须用到的

    DBCP(Database Connection Pool)是Apache软件基金会提供的一个开源数据库连接池组件,它基于Jakarta Commons DBCP项目。在Java应用中,数据库连接池是一个非常重要的组件,它能够有效地管理数据库连接,提高应用...

    数据库连接池所需要用到的三个jar包

    本话题将聚焦于"数据库连接池所需要用到的三个jar包"——`commons-collections-3.1.jar`、`commons-dbcp-1.2.2.jar`和`commons-pool.jar`,它们在数据库连接池实现中的作用以及如何使用。 首先,`commons-...

    基于数据库连接池的D A O模式在J 2 E E应用系统中的实现

    具体而言,文章重点介绍了在设计一个面向物流企业的电子商务系统——包括在线购物和配送管理系统时,如何实现数据库连接池和DAO模式。 #### 逻辑结构与功能结构 ##### 逻辑结构 从逻辑结构来看,系统被分为四个...

    基于jsp的数据库连接池的研究系统毕业设计与实现(源代码+项目报告).zip

    本项目——“基于jsp的数据库连接池的研究系统毕业设计与实现”深入探讨了这一主题,并提供了源代码和项目报告,帮助开发者理解和实践数据库连接池的运用。 首先,我们来理解一下数据库连接池的概念。数据库连接池...

    JSP数据库连接池的研究与实现(源代码+论文).rar

    《JSP数据库连接池的研究与实现》是一个针对Java Web开发中的重要技术——JSP和数据库连接池进行深入探讨的项目。在这个毕业设计中,开发者旨在提高Web应用的性能和效率,通过合理利用数据库连接池来优化数据库操作...

    JSP源码JSP数据库连接池的研究与实现(源代码+论文)

    - **论文解读**:深入理解论文中关于JSP数据库连接池的研究背景、设计思路、优化方法等内容,为实际开发提供理论指导。 通过上述知识点的学习与实践,可以全面掌握如何在JSP项目中实现高效的数据库连接池,从而提升...

    JSP毕业设计-JSP数据库连接池的研究与实现(源代码+论文).zip

    **JSP毕业设计——JSP数据库连接池的研究与实现** 在进行基于JSP的Web应用程序开发时,数据库连接管理是一个至关重要的环节。本项目聚焦于JSP数据库连接池的运用,旨在提高系统的性能和资源利用率。数据库连接池是...

    dbcp连接池依赖包.rar

    DBCP(DataBase Connection Pool)是Apache组织开发的一个开源数据库连接池组件,它的全称为Commons DBCP。...然而,了解DBCP的工作原理和使用方法,对于理解数据库连接池的概念和作用仍然很有帮助。

    数据库连接池所需jar包

    1. **DBCP**:DBCP(Database Connection Pool)是Apache Commons的一个子项目,它提供了JDBC数据源和一个实现了通用对象池API的数据库连接池。DBCP的主要作用是创建和管理数据库连接,避免频繁地打开和关闭连接,...

Global site tag (gtag.js) - Google Analytics