简介

DBCP (DatabaseConnection Pool)是Apache放下的一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。目前 DBCP有两个版本分别是1.3和1.4,其中:1.3版本对应的是JDK 1.4~1.5和JDBC 3,而1.4版本对应JDK 1.6和JDBC4,这两个功能上倒是没有什么区别。
使用DBCP会用到commons-dbcp.jarcommons-pool.jar两个包。

DBCP的工作原理是,程序首先会初始化相应的数据库连接池,以供程序访问,当某个操作需要访问数据库时,程序会首先在连接池中取得空闲连接,如没有空闲连接在创建,用完之后归还连接池,这样达到了连接的重利用,不用频繁的创建连接和销毁,从而优化程序。

DBCP常见属性有:

  • driver:数据库驱动,如 com.mysql.jdbc.Driver
  • url:数据库连接,如 jdbc:mysql://localhost:3306/testDB
  • username:数据库用户名,如 root
  • password:数据库用户名口令,如 root
  • initsize:初始化连接池大小
  • minidle:最小空闲连接
  • maxidle:最大空闲连接。以maxidle=15为例,它表示的在并发的情况下,连接池就必须从数据库中获取 15 个连接来供应程序使用,当应用连接关闭之后,由于 maxidle=10 并不是所有的连接都归还给了数据库,将会有 10 连接保存在连接池中,这时的状态就是空闲。
  • maxactive:最大连接, 表示在并发情况下最大能从数据连接池中获取的连接数
  • maxwait:最大等待时间
  • removeabandoned:是否自动回收超时连接, boolean 类型( true/false )

示例:演示DBCP数据库连接池的用法。

第一步:创建项目在其中导入mysql的驱动以及DBCP相关的jar文件,然后在项目类路径下创建一个名为dbcpcfg.properties的DBCP配置文件,具体信息如下:

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/book?useSSL=true&serverTimezone=UTC&characterEncoding=utf8
username=root
password=root
initialSize=4
maxActive=6
maxIdle=5
minIdle=2
maxWait=6000

第二步:创建DBCP工具类,具体代码如下:

public class DBUtil {private static DataSource dataSource;
private DBUtils() {}static{try {InputStream in = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpcfg.properties");//读取配置文件,初始化数据源Properties props = new Properties();props.load(in);dataSource = BasicDataSourceFactory.createDataSource(props);}  catch (Exception e) {throw new ExceptionInInitializerError(e);}}   public static DataSource getDataSource(){return dataSource;}public static Connection getConnection(){try {return dataSource.getConnection();} catch (SQLException e) {throw new RuntimeException("get database connection failed");}}
}

第三步:提供测试代码:

  • 对于某个特定的数据库(MySQL)来说一个DataSource最多只能产生maxActive个Connection。Connection用完之后若不释放,就会发生不够用的情况;若及时释放,则不会发生不够用的情况。
public static void main(String[] args) {for(int i =0;i<8;i++) {Connection conn = DBUtil.getConnection();System.out.println(i+": "+conn);try {// conn.close();   // ------ ①} catch (SQLException e) {e.printStackTrace();}}
}
运行测试代码,当将编号①处的代码注释起来时,在控制台中输出6个Connection,过了一会(大约6秒)程序报错关闭,如下图14.8所示;当让编号①处的代码执行时,程序会在控制台上输出10个Connection对象。
  • 对于特定的数据库(比如MySQL)来说,它能产生的DataSource数量是有限的
public static DataSource getDataSource() throws Exception {Properties props = new Properties();InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("dbcpcfg.properties");props.load(is);DataSource ds = BasicDataSourceFactory.createDataSource(props);return ds;
}
public static void main(String[] args) throws Exception {for (int i = 0; i < 3000; i++) {DataSource ds = getDataSource();System.out.println(i + ": " + ds.hashCode());}
}

数据库连接池技术 之 DBCP相关推荐

  1. jndi mysql数据库_数据库连接池技术中dbcp、c3p0、jndi

    数据库连接池技术中dbcp.c3p0.jndi 发布时间:2020-05-26 08:52:33 来源:51CTO 阅读:371 作者:ikilun 不管通过何种持久化技术,都必须通过数据连接访问数据 ...

  2. JBDC数据库连接池技术(学习笔记)

    1 JDBC数据库连接池的必要性 传统模式下开发web程序: 先建立数据库连接 sql的基本操作 断开连接 这种模式下的弊端: 1 JDBC数据库连接使用 DriverManager 来获取 2 Co ...

  3. 【JDBC】数据库连接池技术

    文章目录 一.数据库连接池技术 二.多种开源的数据库连接池 一.数据库连接池技术 1.数据库连接池的基本思想︰ 就是为数据库连接建立一个"缓冲池".预先在缓冲池中放入一定数量的连接 ...

  4. 数据库连接池——C3P0:数据库连接池技术

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

  5. java 连接池技术_java数据库连接池技术原理(浅析)

    在执行数据库SQL语句时,我们先要进行数据连接:而每次创建新的数据库的连接要消耗大量的资源,这样,大家就想出了数据库连接池技术.它的原理是,在运行过程中,同时打开着一定数量的数据库连接,形成数据连接池 ...

  6. 数据库连接池技术详解【吐血整理,疯狂推荐】

    前言 今天来讲一下数据库连接池技术.其实这个名词也就是听起来高大上一点,实际上并不是很复杂的内容,相信在我的讲解下,并且自己实际的将代码写一遍之后,能够对这项技术有较为深刻的理解.废话不多说,开始讲解 ...

  7. java阿里数据库连接池_Java学习:数据库连接池技术

    本节内容 数据库连接池 Spring JDBC : JDBC Template 数据库连接池 1.概念:其实就是一个容器(集合),存放数据库连接的容器 当系统初始化好后,容器中会申请一些连接对象,当用 ...

  8. 基于JDBC的数据库连接池技术研究与应用

    引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开 ...

  9. 数据库连接池及C3P0数据库连接池技术

    数据库连接池(重要) 注意数据库连接池只是简化获得数据库连接对象和关流的部门 1.数据库连接池: 1.概念: 其实就是一个容器(在Java中就是集合),存在数据库连接的容器,当系统初始化好后,容器被创 ...

最新文章

  1. [转载]oracle索引的简单总结
  2. IOS多线程 - 使用线程加载一张图片 - NSThread(1)(转)
  3. IP头中的校验和计算方法介绍
  4. Shared pool内存块组成结构及4031错误原因分析
  5. php中获取ip的地域信息比较精准
  6. shell脚本实例-判断主机存活 以及企业备份方案
  7. PAT乙级-1070. 结绳(25)
  8. 38 ubuntu/windows双系统安装
  9. 1006 换个格式输出整数 (15 分)
  10. 2进制 , 8进制 , 10进制 , 16进制 , 介绍 及 相互转换 及 快速转换
  11. springboot 事务嵌套问题_在springboot中写单元测试解决依赖注入和执行后事务回滚问题...
  12. spark学习-40-Spark的UnifiedMemoryManager
  13. 扫二维码缴违章停车罚款?骗你的!
  14. 计算机无法安装小丸工具箱,小丸工具箱
  15. 计算机管理系统有几种,ERP系统有几种?怎么分类
  16. 虹软视觉人工智能开放平台创享会圆满落幕,干货满满频获点赞
  17. 拼团返利电商系统(拼返系统)v2.6
  18. WPF 按钮动画效果制作
  19. python里使用协程和StreamReader、StreamWriter来创建echo服务端
  20. 干盘管蒸发冷-间接蒸发冷的终结者?-孙长青

热门文章

  1. 模型——二维偏序与三维偏序
  2. 编写程序常犯的几个错误
  3. 人工智能之深度学习应用实践60讲
  4. 基于 k8s 搭建 mysql 5.7 主从复制集群
  5. 虚拟网络软件 hamachi
  6. Verilog中pullup(scl)和assign (weak0, weak1) scl = 1‘b1的区别
  7. 高斯消元(个人笔记)
  8. 观《优矿量化分析师日记-讲师李涛涛》笔记
  9. html类选择器和id选择器,HTML+CSS:css选择器介绍之标签选择器、类选择器以及ID选择器...
  10. 2021年起重机械指挥考试题及起重机械指挥考试试卷