一、简介  

动态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方法释放掉旧的连接。

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

  1. public class ConnectionPool {
  2. public boolean initialize() {
  3. //连接池的初始化
  4. return true;
  5. }
  6.  
  7. public void destroy() {
  8. //连接池的销毁
  9. }
  10.  
  11. public synchronized PoolConn getConnection() {
  12. //获取一个连接
  13. }
  14.  
  15. public synchronized void close() {
  16. //关闭一个连接
  17. }
  18.  
  19. private synchronized void removeFormPool() {
  20. //把一个连接从连接池中移除
  21. }
  22.  
  23. public static synchronized void packPool() {
  24. //维护连接池的大小
  25. }
  26. }

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

  1. class ConnObject {
  2. private java.sql.Connection conn;
  3. public java.sql.Connection getConn() {
  4.  
  5. }
  6.  
  7. public void closeConn() {
  8.  
  9. }
  10. }

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

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

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. tips [终端]

    pbcopy 命令:Place standard output in the clipboard. $ pbcopy < ~/.ssh/id_rsa.pub

  2. 使用URL读取网络图片资源

    URL(Uniform Resource Locator) 对象代表统一资源定位器. 代码如下: public class MainActivity extends ActionBarActivity ...

  3. MSSQL 字符串替换语句

    MSSQL替换语句:update 表名 set 字段名=replace(cast(字段名 as varchar(8000)),'abc.com','123.com')例如:update PE_Arti ...

  4. php在.php文件中设置php.ini,仅对当前文件有效

    ini_set (PHP 4, PHP 5, PHP 7) ini_set — 为一个配置选项设置值 折叠返回值 成功时返回旧的值,失败时返回 FALSE. 折叠范例 <?php echo in ...

  5. 完整版的strcpy函数

    char *strcpy(char *strDest,const char *strSrc) { assert((strDest!=NULL) && (strSrc!=NULL)); ...

  6. 电机KV值对应的桨

    KV2200 -6寸 KV1400 -8寸 KV1000 -10寸

  7. NET调用Java之100-Continue的坑

    场景:这段时间开发的时候遇到了需要NET调用java的restful api的情况,java端用的服务器是tomcat,框架是spring boot,net调用java端的接口之后只要java端的接口 ...

  8. Xcode 如何设置 自动内存管理 转换为 手动内存管理

    建议使用自动内存管理 ARC. 如果不想自动内存管理,可以在build phases 下的compile sources 中找到不想自动管理的.m文件 ,给它加compiler flags 为 -fn ...

  9. 转:VC中MessageBox的常见用法

    一.关于MessageBox       消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.       1.MessageBox("这是一个最简单的 ...

  10. 使用jsoup解析html页面内容案例

    public String getFaGuiKuTitles(String type, int page) { String href = "http://info.qd-n-tax.gov ...