一、简介  

动态Web站点往往用数据库存储的信息生成Web页面,每一个页面请求导致一次数据库访问。连接数据库不仅要开销一定的通信和内存资源,还必须完成用户验证、安全上下文配置这类任务,因为往往成为最为耗时的操作。

  如果某个基于数据库的应用系统只需建立一次初始连接或者使用很少的打开、关闭数据库连接操作就可以完成工作,那么,系统的性能会得到显著的改善。实现这种思路的方法是:使多个请求能够共享同一个连接。连接池很好地满足了这样的要求,由连接池来管理数据连接的建立和注销,初始化时建立多条连接,以供客户使用。

  用JSP开发Web应用系统,多数是基于数据库的程序,建立数据库连接的操作将是消耗系统资源最大的操作之一,如何减少这种开销,是开发人员应该首要关注的问题。

  

  如何开发基于数据库的Web系统的传统模式:

  1、在JavaBeans或者Servlet中建立数据库连接。

  2、在页面(JSP等)中调用JavaBeans获取连接,执行Sql操作并返回结果集。

  3、断开数据库连接。

  连接池技术:

  由连接池来管理数据库连接的建立和注销。连接池初始化时建立多条连接,供给不同的请求使用,多个请求可以共享同一连接,这样做,就可以减少打开、关闭数据库连接的操作,从而改善了系统的性能。

二、连接池原理介绍

  顾名思义,连接池最基本的思想就是预先建立一些连接放置于内存对象中以备使用。

  一个连接池“拥有”一定数量的连接,当客户程序发出数据库连接请求时,连接池会从“池”中取出一个空闲的连接给客户程序,并将该连接状态设置成已占用;当客户程序使用完毕后,不会真正关闭这个连接,只是将其放回“池”中,同时将连接状态设置成空闲。如果“池”中没有空闲的连接,连接池可以根据某种策略自动地建立一个或多个连接,供后面的程序使用。

  可见,连接的建立、断开以及一个池可以拥有的最大连接数都由连接池自身管理,客户程序可以不再关系这类事情,这样就实现了连接的共享,提供了 每个连接的利用效率。

三、设计思路

  使用连接池的目的是想通过其自身的管理机制来管理数据库连接的状态和使用情况,包括管理连接池内连接的最大数、最小数、稳定数、连接时间、可用连接等等。因此,一个连接池管理类应该具有以下属性:

  poolMaxSize: 最大连接数

  poolSteadySize: 稳定大小

  poolInitSize: 初始化大小

  validPooledConnList: 容纳可用的缓冲数据库连接对象的容器——可用池

  allPooledConnList: 所有的缓冲对象(可用的、不可用的)的容器——管理池

  连接池的自由管理:静态管理、动态管理

  静态管理:

  静态管理是在客户程序发出请求时,连接池会检查各个连接的状态,并提供可用连接。运用连接池做一次连接的过程如下:

1. 初始化连接池,new 一定量的connection.

2. 客户程序发出访问数据库的请求,连接池查找可用连接,如果找到,则直接返回一个连接。

3. 如果没有空闲连接,则重新new 一个connection并且把它放到池里,然后返回这个connection.

4. 如果连接池满了,程序是会停止new新的connection,客户程序可以调用连接池的release方法释放掉旧的连接。

  动态管理:通过一个线程定时地对每个连接的状态、连接的数量进行判断而进行相应的操作。

public class ConnectionPool {
public boolean initialize() {
//连接池的初始化
return true;
} public void destroy() {
//连接池的销毁
} public synchronized PoolConn getConnection() {
//获取一个连接
} public synchronized void close() {
//关闭一个连接
} private synchronized void removeFormPool() {
//把一个连接从连接池中移除
} public static synchronized void packPool() {
//维护连接池的大小
}
}

  通过这几个方法,已经可以完成连接池的基本管理。因为我们要保存每一个连接的状态,所以还需要一个数据库连接对象:

class ConnObject {
private java.sql.Connection conn;
public java.sql.Connection getConn() { } public void closeConn() { }
}

  这样,在连接池中操作的连接对象是ConnObject,当其他程序访问数据库时需要的只是ConnObject的conn属性,因为我们再加入一个类,封装这个实际的数据库连接对象,作为其他程序获得和释放数据库连接的方法。

class ConnBean {
public java.sql.Connection getConnection();//从连接池中取出一个有效的连接
public void releaseConnection();//释放连接,此时并没有关闭连接,只是将连接放回连接池中 protected void setConnection(java.sql.Connection conn);
void destroyPool();//销毁连接池
}

Java为什么使用连接池的更多相关文章

  1. Java基础-DBCP连接池(BasicDataSource类)详解

    Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 ...

  2. java JDBC (八) 连接池 DBCP

    package cn.sasa.demo1; import javax.sql.DataSource; import org.apache.commons.dbcp2.BasicDataSource; ...

  3. Java 自定义FTP连接池

    转自:https://blog.csdn.net/eakom/article/details/79038590 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn ...

  4. java使用DBCP连接池创建工具类

    1.说明 java中有个扩展包 javax下面有个DataResource的接口  javax.sql.DataResource 该接口定义了连接池的方法规范 而DBCP框架有apache公司开发,他 ...

  5. MySQL_(Java)【连接池】简单在JDBCUtils.java中创建连接池

    MySQL_(Java)[事物操作]使用JDBC模拟银行转账向数据库发起修改请求 传送门 MySQL_(Java)[连接池]使用DBCP简单模拟银行转账事物 传送门 Java应用程序访问数据库的过程: ...

  6. Java之ConnectionPool连接池

    1.初始化(根据配置信息进行初始化)2.产生一个新的数据库连接3.有存储已经使用的连接集合,空闲连接集合4.提供给外部调用获取连接的方法5.提供给外部释放连接(不是关闭连接,而是将连接闲置)6.销毁连 ...

  7. Java Hibernate 之连接池详解

    Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool,以及DBCP.在配置连接池时需要注意的有三点: 一.Apche的DBCP在Hibernate2中受支持,但在Hiber ...

  8. Java之JDBC连接池

    数据库连接池 连接池的概述 概念:其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时, 从容器中获取连接对象,用户访问完之后 ...

  9. Java中JDBC连接池&JDBCTemplate

    数据库连接池 概念:其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归 ...

随机推荐

  1. Android Design Support Library: 学习CoordinatorLayout

    简述 CoordinatorLayout字面意思是"协调器布局",它是Design Support Library中提供的一个超级帧布局,帮助我们实现Material Design ...

  2. SQL 2008R2 日期转换

    --SQL CONVERT日期转换 print GETDATE() --相同 Select CONVERT(varchar(100), GETDATE(), 0) AS NDateTime --: 0 ...

  3. CentOS 7 之Shell学习笔记

    脚本是个永恒的话题,以前Dos下面也有Shell编程这一说的,比如说BAT文件有人写的好的话,也是瞬间速度变高大上.Linux下面这个应该更占比重了.我看到园子里有位园友做了一个Linux Shell ...

  4. Phpcms v9系统类库与函数库调用方法

    在分享了n多phpcms的教程后,cmsyou继续分享关于phpcms v9系统类库与函数库的调用方法. 系统类库位于系统的 /libs/functions目录下面,函数库文件名为*.func.php ...

  5. Apache的配置

    Apache的配置由httpd.conf文件配置,因此下面的配置指令都是在httpd.conf文件中修改. 主站点的配置(基本配置) (1) 基本配置: ServerRoot "/mnt/s ...

  6. C程序设计语言练习题1-20

    练习1-20 编写程序detab,将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止位的地方.假设制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位.n应该是变量还是符号 ...

  7. PE文件结构整理

    一直想做一个PE结构的总结,只是学的时候有很多东西就没搞懂,加上时间一长,很多知识也早忘了,也就一直没完成.这几天从头看了下,好不容易理清楚了,整理一下,以免又忘了 pe文件框架结构,图片贴过来太模糊 ...

  8. 前端MVC学习笔记(一)——MVC概要与angular概要、模板与数据绑定

    一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.AngularJS是框架而jQuery则是库. 1.2. ...

  9. 简单讲解iOS应用开发中的MD5加密的相关使用

      简单讲解iOS应用开发中的MD5加密的相关使用   作者:文顶顶 字体:[增加 减小] 类型:转载 时间:2015-12-19 我要评论 这篇文章主要介绍了iOS应用开发中的MD5加密的相关使用, ...

  10. spark Association failed with [akka.tcp:sparkMaster@ip:7077]

    今搭建spark集群, conf/spark-env.sh 配制如下 export SPARK_MASTER_IP=masterexport SPARK_MASTER_PORT=7077export ...