随着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 Pool是Java应用中实现数据库连接池的重要工具,它们能够有效地管理数据库连接,提升应用的并发性能和资源利用率。在实际开发中,正确配置和使用这两个组件对于优化数据库操作和提高应用整体...
DBCP(Jakarta Commons DBCP)是Apache软件基金会提供的一个开源数据库连接池实现,它基于Apache的Commons Pool对象池实现。在本话题中,我们将深入探讨DBCP如何工作以及如何配置这两个关键的jar包——`commons-pool...
本项目“JSP毕业设计——JSP数据库连接池的研究与实现”显然聚焦于如何高效地管理和使用数据库资源,特别是通过数据库连接池来优化性能。 数据库连接池是现代Web应用中一个关键的组件,它的核心功能是管理数据库...
本文将深入解析几种常用的数据库连接池——Apache DBCP、C3P0、Proxool、BoneCP的详细配置参数,帮助开发者更好地理解和应用这些技术。 ### Apache DBCP **dataSource**: 配置数据源,通常在应用服务器的配置文件...
在给定的标题和描述中,我们聚焦于两个关键的库——`commons-dbcp.jar`和`commons-pool.jar`,它们是Apache Commons项目的一部分,用于实现数据库连接池功能。 `commons-dbcp`(Database Connection Pool)是Apache...
本文将详细解析“数据库连接池——JDBC通过代理模式来保持用户关闭连接的习惯”这一主题,并以`MyConnectionHandler.java`作为示例代码进行讲解。 首先,我们需要了解数据库连接池的基本概念。数据库连接池,又称为...
Apache Commons DBCP(Database Connection Pool)是一个开源的Java数据库连接池组件,它提供了一种在Java应用中管理和复用数据库连接的方式。这个组件是Apache软件基金会 Commons项目的一部分,其设计目的是提高...
在Java中,我们可以使用多种库来创建数据库连接池,如C3P0、DBCP、HikariCP等。本示例将重点讨论如何使用JDBC API和JDK自带的日志系统进行简单的数据库连接池配置。 首先,数据库连接池的基本工作原理是预先创建...
DBCP(Database Connection Pool)是Apache软件基金会提供的一个开源数据库连接池组件,它基于Jakarta Commons DBCP项目。在Java应用中,数据库连接池是一个非常重要的组件,它能够有效地管理数据库连接,提高应用...
本话题将聚焦于"数据库连接池所需要用到的三个jar包"——`commons-collections-3.1.jar`、`commons-dbcp-1.2.2.jar`和`commons-pool.jar`,它们在数据库连接池实现中的作用以及如何使用。 首先,`commons-...
具体而言,文章重点介绍了在设计一个面向物流企业的电子商务系统——包括在线购物和配送管理系统时,如何实现数据库连接池和DAO模式。 #### 逻辑结构与功能结构 ##### 逻辑结构 从逻辑结构来看,系统被分为四个...
本项目——“基于jsp的数据库连接池的研究系统毕业设计与实现”深入探讨了这一主题,并提供了源代码和项目报告,帮助开发者理解和实践数据库连接池的运用。 首先,我们来理解一下数据库连接池的概念。数据库连接池...
《JSP数据库连接池的研究与实现》是一个针对Java Web开发中的重要技术——JSP和数据库连接池进行深入探讨的项目。在这个毕业设计中,开发者旨在提高Web应用的性能和效率,通过合理利用数据库连接池来优化数据库操作...
- **论文解读**:深入理解论文中关于JSP数据库连接池的研究背景、设计思路、优化方法等内容,为实际开发提供理论指导。 通过上述知识点的学习与实践,可以全面掌握如何在JSP项目中实现高效的数据库连接池,从而提升...
**JSP毕业设计——JSP数据库连接池的研究与实现** 在进行基于JSP的Web应用程序开发时,数据库连接管理是一个至关重要的环节。本项目聚焦于JSP数据库连接池的运用,旨在提高系统的性能和资源利用率。数据库连接池是...
DBCP(DataBase Connection Pool)是Apache组织开发的一个开源数据库连接池组件,它的全称为Commons DBCP。...然而,了解DBCP的工作原理和使用方法,对于理解数据库连接池的概念和作用仍然很有帮助。
1. **DBCP**:DBCP(Database Connection Pool)是Apache Commons的一个子项目,它提供了JDBC数据源和一个实现了通用对象池API的数据库连接池。DBCP的主要作用是创建和管理数据库连接,避免频繁地打开和关闭连接,...