JDBC核心技术_第8章:数据库连接池

news2024/11/25 6:56:04

目录

  • 8.1 JDBC数据库连接池的必要性
    • 8.2 数据库连接池技术
    • 8.3 多种开源的数据库连接池
      • 8.3.1 C3P0数据库连接池
      • 8.3.2 DBCP数据库连接池
      • 8.3.3 Druid(德鲁伊)数据库连接池

8.1 JDBC数据库连接池的必要性

  • 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤:
    • 在主程序(如servlet、beans)中建立数据库连接
    • 进行sql操作
    • 断开数据库连接
  • 这种模式开发,存在的问题:
    • 普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用。若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。

    • 对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。(回忆:何为Java的内存泄漏?)

    • 这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内
      存泄漏,服务器崩溃。

8.2 数据库连接池技术

  • 为解决传统开发中的数据库连接问题,可以采用数据库连接池技术。
  • 数据库连接池的基本思想:就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
  • 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
  • 数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

在这里插入图片描述

  • 工作原理:
    在这里插入图片描述
  • 数据库连接池技术的优点
    1. 资源重用
    由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。
    2. 更快的系统反应速度
    数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间
    3. 新的资源分配手段
    对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库连接数的限制,避免某一应用独占所有的数据库资源
    4. 统一的连接管理,避免数据库连接泄漏
    在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露

8.3 多种开源的数据库连接池

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

    • DBCP 是Apache提供的数据库连接池。tomcat 服务器自带dbcp数据库连接池。速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持。
    • C3P0 是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以。hibernate官方推荐使用
    • Proxool 是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点
    • BoneCP 是一个开源组织提供的数据库连接池,速度快
    • Druid 是阿里提供的数据库连接池,据说是集DBCP 、C3P0 、Proxool 优点于一身的数据库连接池,但是
      速度不确定是否有BoneCP快
  • DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池

  • DataSource用来取代DriverManager来获取Connection,获取速度快,同时可以大幅度提高数据库访问速度。

  • 特别注意:

    • 数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。
    • 当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但conn.close()并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。

8.3.1 C3P0数据库连接池

导包

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

doc中是说明文档

在这里插入图片描述

在这里插入图片描述
配置文件方式:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意名字和文档中相同。

在这里插入图片描述
在这里插入图片描述

c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

	<named-config name="hellc3p0">
<!-- 提供获取连接的4个基本信息 -->
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://localhost:13306/test</property>
		<property name="user">root</property>
		<property name="password">abc123</property>

<!-- 进行数据库连接池管理的基本信息 -->
		<!-- 当数据库连接池中的连接数不够时,c3p0一次性向数据库服务器申请的连接数 -->
		<property name="acquireIncrement">5</property>
		
		<!-- c3p0数据库连接池中初始化时的连接数 -->
		<property name="initialPoolSize">10</property>
		
		<!-- c3p0数据库连接池维护的最少连接数 -->
		<property name="minPoolSize">10</property>
		
		<!-- c3p0数据库连接池维护的最多的连接数,超过100个请求连接时,要等待 -->
		<property name="maxPoolSize">100</property>
		
		<!-- c3p0数据库连接池最多维护的Statement的个数 -->
		<property name="maxStatements">50</property>
		
		<!-- 每个连接中可以最多使用的Statement的个数 -->
		<property name="maxStatementsPerConnection">2</property>

	</named-config>
</c3p0-config>

C3P0Test 类

package com.atguigu4.connection;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;

import org.junit.Test;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.DataSources;

public class C3P0Test {
	//第三方的,因此要导入jar包,使用其中的API实现连接池技术
	
	//方式一:
	@Test
	public void testGetConnection() throws Exception{
		
		//获取c3p0数据库连接池
		ComboPooledDataSource cpds = new ComboPooledDataSource();//DataSource实现类
		cpds.setDriverClass( "com.mysql.jdbc.Driver" ); 
		cpds.setJdbcUrl( "jdbc:mysql://localhost:13306/test" );
		cpds.setUser("root");                                  
		cpds.setPassword("abc123"); 
		
		
		//通过设置相关的参数,对数据库连接池进行管理:
		//设置初始时数据库连接池中的连接数
		cpds.setInitialPoolSize(10);
		
		Connection conn = cpds.getConnection();
		System.out.println(conn);
		
		//销毁c3p0数据库连接池(一般情况我们不关连接池)
//		DataSources.destroy( cpds );
	}
	//方式二:使用配置文件
	@Test
	public void testGetConnection1() throws SQLException{
		ComboPooledDataSource cpds = new ComboPooledDataSource("hellc3p0");
		Connection conn = cpds.getConnection();
		System.out.println(conn);
	}
}

JDBCUtils

	/**
	 * 
	 * @Description 使用C3P0的数据库连接池技术
	 * @author shkstart
	 * @date 下午3:01:25
	 * @return
	 * @throws SQLException
	 */
	//数据库连接池只需提供一个即可。
	private static ComboPooledDataSource cpds = new ComboPooledDataSource("hellc3p0");
	public static Connection getConnection1() throws SQLException{
		Connection conn = cpds.getConnection();
		
		return conn;
	}

8.3.2 DBCP数据库连接池

  • DBCP 是 Apache 软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源系统:Commonpool。如需使用该连接池实现,应在系统中增加如下两个 jar 文件:
    • Commons-dbcp.jar:连接池的实现
    • Commons-pool.jar:连接池实现的依赖库
    • Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。
    • 数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。
    • 当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但上面的代码并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。
    • 配置属性说明

在这里插入图片描述

导包

在这里插入图片描述

在这里插入图片描述

当一个类的提示中出现arg0,那么说明缺少该类的源码

在这里插入图片描述
此时需要导入所需源码

在这里插入图片描述
在这里插入图片描述

DBCPTest 类

package com.atguigu4.connection;

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.junit.Test;

public class DBCPTest {
	/**
	 * 
	 * @Description 测试DBCP的数据库连接池技术
	 * @author shkstart
	 * @throws SQLException 
	 * @date 下午3:20:50
	 */
	//方式一:不推荐
	@Test
	public void testGetConnection() throws SQLException{
		//创建了DBCP的数据库连接池
		BasicDataSource source = new BasicDataSource();//DateSource()的实现类
		
		//设置基本信息
		source.setDriverClassName("com.mysql.jdbc.Driver");
		source.setUrl("jdbc:mysql://localhost:13306/test");
		source.setUsername("root");
		source.setPassword("abc123");
		
		//还可以设置其他涉及数据库连接池管理的相关属性:
		source.setInitialSize(10);
		source.setMaxActive(10);
		//。。。
		
		Connection conn = source.getConnection();
		System.out.println(conn);
	}
	
	//方式二:推荐:使用配置文件
	@Test
	public void testGetConnection1() throws Exception{
		Properties pros = new Properties();
		
		//方式1:
//		InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("dbcp.properties");
		//方式2:
		FileInputStream is = new FileInputStream(new File("src/dbcp.properties"));//识别当前工程
		
		
		pros.load(is);//加载流
		DataSource source = BasicDataSourceFactory.createDataSource(pros);
		
		Connection conn = source.getConnection();
		System.out.println(conn);
	}
	
	
}

dbcp.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:13306/test
username=root
password=abc123

initialSize=10

JDBCUtils

	/**
	 * 
	 * @Description 使用DBCP数据库连接池技术获取数据库连接
	 * @author shkstart
	 * @date 下午3:35:25
	 * @return
	 * @throws Exception
	 */
	//创建一个DBCP数据库连接池
	private static DataSource source;
	static{
		try {
			Properties pros = new Properties();
			FileInputStream is = new FileInputStream(new File("src/dbcp.properties"));
			pros.load(is);
			source = BasicDataSourceFactory.createDataSource(pros);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static Connection getConnection2() throws Exception{
		
		Connection conn = source.getConnection();
		
		return conn;
	}

8.3.3 Druid(德鲁伊)数据库连接池

Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、Proxool等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池,可以说是目前最好的连接池之一。

添加jar包

在这里插入图片描述

添加配置文件
在这里插入图片描述

url=jdbc:mysql://localhost:13306/test
username=root
password=abc123
driverClassName=com.mysql.jdbc.Driver

initialSize=10
maxActive=10

DruidTest 类

package com.atguigu4.connection;

import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

import javax.sql.DataSource;

import org.junit.Test;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

public class DruidTest {
	
	@Test
	public void getConnection() throws Exception{
		Properties pros = new Properties();
		
		InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
		
		pros.load(is);
		
		DataSource source = DruidDataSourceFactory.createDataSource(pros);
		Connection conn = source.getConnection();
		System.out.println(conn);
		
	}
}

JDBCUtils

	/**
	 * 使用Druid数据库连接池技术
	 */
	private static DataSource source1;
	static{
		try {
			Properties pros = new Properties();
			
			InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
			
			pros.load(is);
			
			source1 = DruidDataSourceFactory.createDataSource(pros);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static Connection getConnection3() throws SQLException{
		
		Connection conn = source1.getConnection();
		return conn;
	}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【蓝桥杯系列】2020省赛真题之回文日期

⭐️前面的话⭐️ 本篇文章介绍来蓝桥杯真题之回文日期的题解&#xff0c;展示语言java。 &#x1f4d2;博客主页&#xff1a;未见花闻的博客主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4cc;本文由未见花闻原创&#xff0c…

ArcGIS基础实验操作100例--实验81创建点群最小边界几何

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验81 创建点群最小边界几何 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

MySQL是怎么保证高可用的?

在上一篇文章中,我和你介绍了 binlog 的基本内容,在一个主备关系中,每个备库接收主库的 binlog 并执行。 正常情况下,只要主库执行更新生成的所有 binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。 但是,MySQL 要提供高可用能力…

Python中zipfile压缩包模块的使用

本文主要介绍了Python中zipfile压缩包模块的使用&#xff0c;zipfile 模块提供了创建、读取、写入、添加及列出 ZIP 文件的工具&#xff0c;本文做一个简单的总结。 简介 ZIP 文件格式是一个常用的归档与压缩标准&#xff0c;zipfile 模块提供了创建、读取、写入、添加及列出 …

如何通过QA质量管理提高软件质量?

1、构建了质量检查系统 为了保证软件开发质量&#xff0c;一般来说QA检查单按照检查阶段划分为&#xff1a;需求分析、系统设计、系统实现、系统测试、交付验收、系统运维。 QA质量管理&#xff1a;CoCode项目管理 QA质量管理——QA检查单​ 为了进一步提高检查效果&…

【笔记:第4课】学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春

文章目录前言来源正文小结前言 创作开始时间&#xff1a;2023年1月10日22:41:26 如题&#xff0c;学习一下RISC-V。 来源 https://www.bilibili.com/video/BV1Q5411w7z5?p4&vd_source73a25632b4f745be6bbcfe3c82bb7ec0 正文 操作系统&#xff1a;POSIX 标准。 LLVM有…

ArcGIS基础实验操作100例--实验80随机采样统计

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验80 随机采样统计 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

2022年度总结——一切都在慢慢变好

人生天地之间&#xff0c;若白驹过隙&#xff0c;忽然而已&#xff0c;每个人都希望留下自己的足迹。——题记日月两盏灯&#xff0c;春秋一场梦。回想一年前的现在我在干什么呢&#xff1f;去年的寒假我刚步入大学一个学期&#xff0c;迷茫彷徨&#xff0c;怅然若失&#xff0…

Promise处理异步的并行和串行

一、异步的“并行” 同时处理&#xff0c;相互之间没啥依赖 // 执行FN1返回一个promise实例&#xff0c;实例中管理了一个异步编程的代码&#xff0c;当定时器到时间后&#xff0c;才会把实例的状态改为成功 const fn1 () > {return new Promise(resolve > {setTimeou…

nginx使用!

一&#xff1a;概述 Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好&#xff0c;中国大陆使用 Nginx 网站用户有&#xff1a;百度、京…

NTN(二) Timing Advance

微信同步更新欢迎关注同名modem协议笔记 地面移动系统的传播延迟通常小于 1 毫秒。 相比之下&#xff0c;NTN 中的传播延迟要长得多&#xff0c;延迟从几毫秒到数百毫秒不等&#xff0c;具体取决于星载或机载平台的高度以及 NTN 中的payload类型。 因此对NTN系统&#xff0c;处…

Java 脚本引擎的使用

1. 前言 Java 6 版本就已经引入了 Rhino 引擎用以支持脚本代码运行&#xff0c;而从 Java 8 开始 Nashorn 取代 Rhino 成为 Java 内嵌的 JavaScript 引擎。Nashorn 引擎允许开发人员将 JavaScript 代码嵌入到 Java 中执行&#xff0c;这个特性在复杂的配置系统中有比较大的应用…

javascript reduce()方法

相信挺多人对这个方法还是那么的陌生&#xff0c;其实也能理解&#xff0c;毕竟它能做到的事情还有其他的方法能做到。下面就说一下我个人的理解吧&#xff01;&#xff01;&#xff01;reduce()方法&#xff1a;用法&#xff1a;array.reduce(function(total,currentData,curr…

管理bug的工具

一、国内的bug管理软件&#xff1a; 1、禅道 禅道是第一款国产开源项目管理软件。它的核心管理思想基于敏捷方法scrum&#xff0c;内置了产品管理和项目管理&#xff0c;同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能。在一个软件中就…

nodejs+vue+element+eachers构建开源项目大型连续剧(5)前端请求封装,完成用户注册。

在前端项目开发中&#xff0c;一个好的请求封装可以给我们带来诸多便利&#xff0c;减少了代码重复&#xff0c;优化了问题处理等。那接下来我们一起学习一下怎么做到对一个请求的简单封装吧。主要通过对axios请求的二次封装&#xff0c;实现页面的请求以及必要的优化。 一、引…

Word处理控件Aspose.Words功能演示:在 C# 中将 Word DOC DOCX 转换为 Markdown

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

每个Java程序员都必须知道的四种负载均衡算法

前言 一般来说&#xff0c;我们在设计系统的时候&#xff0c;为了系统的高扩展性&#xff0c;会尽可能的创建无状态的系统&#xff0c;这样我们就可以采用集群的方式部署&#xff0c;最终很方便的根据需要动态增减服务器数量。但是&#xff0c;要使系统具有更好的可扩展性&…

【UE4 第一人称射击游戏】32-添加击杀AI的提示功能(使用到控件蓝图的动画功能)

上一篇&#xff1a;【UE4 第一人称射击游戏】31-更好的UI界面本篇效果&#xff1a;可以看到在击杀AI后&#xff0c;右上角有击杀提示信息步骤&#xff1a;新建一个控件蓝图命名为“KillPopup”双击打开“KillPopup”&#xff0c;拖入一个图像控件&#xff0c;锚点设置为右上角&…

RobotFramework测试库

在RF 测试库里面&#xff0c;分为三种测试库标准测试库扩展测试库远程测试库标准测试库随 Robot Framework 版本一同发布的测试库&#xff0c; 不需要单独安装&#xff0c;但部分标准库仍然需要手动导入标准库有扩展测试库标准库以外的其他测试库都统称为扩展测试库&#xff0c…

OceanBase产品家族及基础概念

第二章&#xff1a;OceanBase产品家族及基础概念 1. OceanBase产品家族 1.1 OceanBase数据库产品家族 1.2 OceanBase数据库内核 1.2.1 高扩展 • 水平扩展 • 按需在线扩容、缩容、不停服务 • 单集群突破100台服务器 1.2.2 高性能 • 峰值6,100万次/秒&#xff08;真实业…