在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤:

  • 在主程序(如servlet、bean)中建立数据库连接
  • 进行sql操作
  • 断开数据库连接

这种模式开发存在各种各样的问题,最重要的是:数据库的连接资源并没有得到很好的重复利用。

为解决传统开发中的数据库连接问题,可以采用数据库连接池技术,其基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从“缓冲池”中取出一个,使用完毕之后再放回去。

数据库连接池:负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

数据库连接池在初始化时,将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保持至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

数据库连接池技术的优点

  • 资源重用
  • 更快的系统反应速度
  • 新的资源分配手段
  • 统一的连接管理,避免数据库连接泄露

两种开源的数据库连接池

  JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由服务器(Weblogic,WebSphere,Tomcat)提供实现,也有一些开源组织提供实现

  • DBCP
  • C3P0

  DataSource通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把DataSource称为连接池

DBCP测试,Tomcat内置

  1. 加入jar包(2个包)dbcp和pool
  2. 创建数据库连接池

DBCP工厂测试

  加载dbcp的properties配置文件:配置文件中的键值对,键需要来自BasicDataSource的属性
  调用BasicDataSourceFactory的createDataSource方法创建DataSource实例
  从DataSource实例中获取数据库连接

dbcp.properties

username=root
password=123456
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/testjdbc?serverTimezone=GMT%2B8 initialSize=10
maxTotal=50
minIdle=5
maxWaitMillis=5000

DBCP测试

package com.litian.jdbc;

import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory; import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties; /**
* @author: Li Tian
* @contact: litian_cup@163.com
* @software: IntelliJ IDEA
* @file: TestDBCP.java
* @time: 2020/4/6 13:28
* @desc: |使用DBCP数据库连接池
*/ public class TestDBCP { public static void main(String[] args) throws Exception {
testDBCPwithDataSourceFactory();
} /**
* 利用DBCP工厂建立连接池
*/
public static void testDBCPwithDataSourceFactory() throws Exception {
Properties p = new Properties();
InputStream is = TestDBCP.class.getClassLoader().getResourceAsStream("dbcp.properties");
p.load(is);
DataSource ds = BasicDataSourceFactory.createDataSource(p);
System.out.println(ds.getConnection()); BasicDataSource bs = (BasicDataSource) ds;
System.out.println(bs.getMaxWaitMillis());
} public static void testDBCP(){
// 1. 创建DBCP数据源实例
BasicDataSource ds = null;
ds = new BasicDataSource();
// 2. 为数据源实例指定必须的属性
ds.setUsername("root");
ds.setPassword("123456");
ds.setUrl("jdbc:mysql://localhost:3306/testjdbc?serverTimezone=GMT%2B8");
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
// 3. 指定数据源的一些可选属性
// 3.1 指定数据库连接池初始化连接数的个数
ds.setInitialSize(10);
// 3.2 指定最大的连接数,现在的代码中已经没有setMaxActive这个方法名了
// 同一时刻可以同时向数据库申请的连接数
ds.setMaxTotal(50);
// 3.3 指定小连接数
// 在数据库中连接池中最少有多少个空闲连接数
ds.setMinIdle(5);
// 3.4 等待连接池分配连接,最长的等待时间.单位为毫秒,超出该时间抛异常。
ds.setMaxWaitMillis(1000 * 5); try {
// 4. 从数据源中获取数据库连接
Connection conn = ds.getConnection();
System.out.println(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}

C3P0

  加入jar包(2个包)C3P0和mchange-commons-java
  创建数据库连接池
C3P0工厂测试,Hibernate官方推荐,参考连接

  在src创建一个c3p0-config.xml文件
  创建ComboPooledDataSource实例
  从DataSource实例中获取数据库连接

c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 这是默认配置信息 -->
<default-config>
<!-- 连接四大参数配置 -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbctest</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 池参数配置 -->
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
</default-config> <!-- 专门为oracle提供的配置信息 -->
<named-config name="oracle-config">
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">123</property>
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
</named-config> <!-- 专门为Mysql提供的配置信息 -->
<named-config name="mysql-config">
<property name="jdbcUrl">jdbc:mysql://localhost:3306/testjdbc?serverTimezone=GMT%2B8</property>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">123456</property> <!-- 若数据库中连接数不足时,一次向数据库服务器申请多少个连接 -->
<property name="acquireIncrement">5</property>
<!-- 初始化数据库连接池时连接的数量 -->
<property name="initialPoolSize">5</property>
<!-- 数据库连接池中最小的数据库连接数 -->
<property name="minPoolSize">5</property>
<!-- 数据库连接池中最大的数据库连接数 -->
<property name="maxPoolSize">10</property> <!-- C3P0数据库连接池可以维护的Statement的个数 -->
<property name="maxStatements">20</property>
<!-- 每个连接同时可以使用的Statement对象的个数 -->
<property name="maxStatementsPerConnection">5</property> </named-config>
</c3p0-config>

C3P0测试

package com.litian.jdbc;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection; /**
* @author: Li Tian
* @contact: litian_cup@163.com
* @software: IntelliJ IDEA
* @file: TestC3P0.java
* @time: 2020/4/6 14:40
* @desc: |使用C3P0数据库连接池
*/ public class TestC3P0 { public static void main(String[] args) throws Exception {
// test2();
test3();
} public static void test3() throws Exception{
Connection conn = JDBCTools.getDSConnection();
System.out.println(conn);
} public static void test2() throws Exception{
DataSource ds = new ComboPooledDataSource("mysql-config");
System.out.println(ds.getConnection());
ComboPooledDataSource cpds = (ComboPooledDataSource) ds;
System.out.println(((ComboPooledDataSource) ds).getMaxStatements());
} public static void test1() throws Exception{
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass("com.mysql.cj.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/testjdbc?serverTimezone=GMT%2B8");
cpds.setUser("root");
cpds.setPassword("123456");
System.out.println(cpds.getConnection());
}
}

修改JDBCTools工具类,加入数据库连接池功能

private static DataSource ds = null;

// 数据库连接池应只被初始化一次。
static {
ds = new ComboPooledDataSource("mysql-config");
} public static Connection getDSConnection() throws Exception {
return ds.getConnection();
}

————————————————
版权声明:本文为CSDN博主「李英俊小朋友」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_21579045/article/details/105386353

MYSQL 之 JDBC(十五):数据库连接池的更多相关文章

  1. java web学习总结(十六) -------------------数据库连接池

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  2. jdbc基础 (五) 连接池与数据源 DBCP以及C3P0的使用

    一.连接池的概念和使用 在实际应用开发中,特别是在WEB应用系统中,如果JSP.Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接.打开数据库.存取数 ...

  3. javaweb学习总结(三十九)——数据库连接池

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  4. JDBC整合c3p0数据库连接池 解决Too many connections错误

    前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误. Caused by: ...

  5. springboot(二十):数据库连接池介绍

    概述 性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 .hikariCP的高性能得益于最大限度的避免锁竞争. druid功能最为全面,sql ...

  6. JavaWeb学习(三十)———— 数据库连接池

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  7. javaweb(三十九)——数据库连接池

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  8. JDBC 线程安全 数据库连接池

    jdbc 是线程安全的,但是,推荐一个线程用一个链接 JDBC is thread safe: It is quite OK to pass the various JDBC objects betw ...

  9. 十四 数据库连接池&DBUtils

    关于数据库连接池: 1 数据库的连接对象创建工作,比较消耗性能. 2 一开始在内存中开辟一块空间,往池子里放置多个连接对象,需要连接的时候从连接池里面调用, 使用完毕归还连接,确保连接对象能够循环利用 ...

  10. 【JDBC核心】数据库连接池

    数据库连接池 传统模式 使用数据库的传统模式: 在主程序(servlet.beans等)中建立数据库连接: 进行 SQL 操作: 断开数据库连接. 这种模式存在的问题: JDBC 连接数据库的方式(四 ...

随机推荐

  1. 关于领域驱动设计 DDD(Domain-Driven Design)

    以下旨在 理解DDD. 1.     什么是领域? 妈妈好是做母婴新零售的产品,应该属于电商平台,那么电商平台就是一个领域. 同一个领域的系统都有相同的核心业务. eg: 电商领域都有:商品浏览.购物 ...

  2. Cron表达式,springboot定时任务

    详细请看这篇博客 参考:https://blog.csdn.net/belonghuang157405/article/details/83410197 Cron表达式是一个字符串,字符串以5或6个空 ...

  3. maven配置错误之Unable to import maven project: See logs for details

    很多朋友在初次使用maven时,都会出现这个问题. 一加载maven项目,即会报出Unable to import maven project这样的错误,哪怕是新的maven项目也不例外. 我查阅了很 ...

  4. vue 生成二维码+截图

    链接生成二维码 1.npm安装 npm install --save qrcodejs2 2.引入 import QRCode from 'qrcodejs2' 3.生成二维码 new QRCode( ...

  5. Scrapy学习1:安装

    Install Scrapy 熟悉PyPI的话,直接一句 pip install Scrapy 但是有时候需要处理安装依赖,不能直接一句命令就安装结束,这个和系统有关. 我用的Ubuntu,这里仅介绍 ...

  6. 能被 K 整除的最大连续子串长度

    [来源]网上流传的2017美团秋招笔试题 [问题描述] 两个测试样例输出都是5 [算法思路] 暴力解法时间会超限,使用一种很巧妙的数学方法.用在读取数组arr时用数组sum记录其前 i 项的和,即 s ...

  7. 成为python程序员,对疫情过后的毕业生来说,真是一个不错的方向吗?

    Python最近几年,一直被炒得很火,这其中有商业因素,但更重要的是即将到来的人工智能时代,而python就恰好是最适合的编程语言. 所以无论是在职的人,还是在校的学生,都想着跟上这一趋势,但,在今年 ...

  8. 磨皮美颜算法 附完整C代码

    前言 2017年底时候写了这篇<集 降噪 美颜 虚化 增强 为一体的极速图像润色算法 附Demo程序> 这也算是学习过程中比较有成就感的一个算法. 自2015年做算法开始到今天,还有个把月 ...

  9. Java中String创建原理深入分析

    创建String对象的常用方式: 1.  使用new关键字 String s1 = new String(“ab”);  // 2.  使用字符串常量直接赋值 String s2 = “abc”; 3 ...

  10. Newtonsoft 六个超简单又实用的特性,值得一试 【下篇】

    一:讲故事 上一篇介绍的 6 个特性从园子里的反馈来看效果不错,那这一篇就再带来 6 个特性同大家一起欣赏. 二:特性分析 1. 像弱类型语言一样解析 json 大家都知道弱类型的语言有很多,如: n ...