JDBC常见的几种连接池使用(C3PO、Druid、HikariCP 、DBCP)

✨前言✨
本篇作为主要在于介绍jdbc数据库连接池,以及多种连接池的用法

🍒欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁
🍒博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言


文章目录

  • 一,JDBC数据库连接池的必要性
  • 二,数据库连接池技术
  • 三,多种开源的数据库连接池
    • 1,C3P0数据库连接池
    • 2,Druid (德鲁伊) 数据库连接池
    • 3,HikariCP数据库连接池
    • 4,DBCP数据库连接池

一,JDBC数据库连接池的必要性

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

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

2,这种模式开发,存在的问题:

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

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

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


二,数据库连接池技术

为解决传统开发中的数据库连接问题,可以采用数据库连接池技术。

1、数据库连接池的基本思想:

  • 就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

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

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


2、数据库连接池的工作原理:

在这里插入图片描述


3、数据库连接池技术的优点:

(1)资源重用
 由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。

(2)更快的系统反应速度
 数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间

(3)新的资源分配手段
 对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库连接数的限制,避免某一应用独占所有的数据库资源

(4)统一的连接管理,避免数据库连接泄漏
 在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露


三,多种开源的数据库连接池

1、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快。

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

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

特别注意:

  • 数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。

  • 当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close();
    但conn.close()并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。


1,C3P0数据库连接池

jar包资源获取 链接:
https://pan.baidu.com/s/1i2I_KacKLyMyZPvJLseMoQ?pwd=0101

解压之后把下面两个jar包添加到库,新版需要添加这两个到库中,如下

在这里插入图片描述

添加xml配置文件,文件名c3p0-config.xml固定的可复制,上面资源包中也有

<c3p0-config><!--使用默认的配置读取数据库连接池对象 --><default-config><!--  连接参数 --><property name="driverClass">com.mysql.cj.jdbc.Driver</property><!--   连接数据库参数     --><property name="jdbcUrl">jdbc:mysql://localhost:3306/sciencedb</property><!--   用户     --><property name="user">root</property><!--   密码     --><property name="password">root</property><!-- 连接池参数 --><!--初始化申请的连接数量--><property name="initialPoolSize">5</property><!--最大的连接数量--><property name="maxPoolSize">10</property><!--超时时间--><property name="checkoutTimeout">3000</property></default-config><!--    <named-config name="otherc3p0">--><!--        &lt;!&ndash;  连接参数 &ndash;&gt;--><!--        <property name="driverClass">com.mysql.jdbc.Driver</property>--><!--        <property name="jdbcUrl">jdbc:mysql://localhost:3306/hs_test?serverTimezone=Asia/Shanghai</property>--><!--        <property name="user">root</property>--><!--        <property name="password">root</property>--><!--        &lt;!&ndash; 连接池参数 &ndash;&gt;--><!--        <property name="initialPoolSize">5</property>--><!--        <property name="maxPoolSize">8</property>--><!--        <property name="checkoutTimeout">1000</property>--><!--    </named-config>-->
</c3p0-config>

连接测试:

 @Testpublic void Test_1() throws Exception{//获取到c3p0中默认的数据源ComboPooledDataSource comboPooledDataSource =new ComboPooledDataSource();//传入参数使用指定的c3p0连接池//ComboPooledDataSource comboPooledDataSource =//       new ComboPooledDataSource("otherc3p0");//创建连接数据库Connection conn = comboPooledDataSource.getConnection();System.out.println(conn);conn.close();}

输出显示:

在这里插入图片描述

c3p0需要配置log4j日志不然的话控制台会输出很多日志信息

https://blog.csdn.net/sjs52406/article/details/134472475?spm=1001.2014.3001.5502

https://blog.csdn.net/weixin_50552284/article/details/115732145

配置文件log4j.properties

#日志打印的级别及目的地	debug>info>warn>error>fatal
#stdout控制台	logfile日志文件
log4j.rootLogger=warn  , stdout,logfile# Console output...打印到控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}  %F %p %m%n#日志文件打印设置
log4j.appender.logfile=org.apache.log4j.FileAppender
#日志的文件地址
log4j.appender.logfile.File=gdLog.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %F %p %m%n

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

jar包资源获取 链接:

https://pan.baidu.com/s/1n992-5zlNGN8ZvglS6yFZA?pwd=0101

同样需要添加在项目中,如下:

在这里插入图片描述

添加配置文件文件名不固定

#驱动名称(连接MySQL)
driverClassName = com.mysql.cj.jdbc.Driver
# 参数 ? rewiteBatchedStatments = true 表示支持批处理机制
url = jdbc:mysql://localhost:3306/chenzhoudianyin
# 用户名
username = root
# 密码
password = root
# 初始化连接数量
initialSize = 10
# 最小连接数量
minIdle = 5
# 最大连接数量
maxActive = 500
# 超时5000ms (在等待队列的最长等待时间,诺超时,放弃此次连接)
maxWait = 5000

连接测试:

@Test
public void Test1() throws Exception {//加载配置文件Properties properties = new Properties();properties.load(new FileInputStream("src\\jdbc.properties"));//在工厂中 创建一个数据库, 数据源的连接信息来源于,properties配置文件中DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);Connection conn = dataSource.getConnection();System.out.println(conn);conn.close();}

输出显示:

在这里插入图片描述


3,HikariCP数据库连接池

jar包资源获取 链接:

https://pan.baidu.com/s/1z4TBBhONEwZQ6-eayvyb8w?pwd=0101

HikariCP 也需要配置log4j日志,如下

在这里插入图片描述

添加配置文件:

# 数据库连接URL
jdbcUrl=jdbc:mysql://localhost:3306/chenzhoudianyin
# 数据库用户名
username=myusername
# 数据库密码
password=mypassword
# 连接池名称
poolName=MyConnectionPool
# 连接池大小
maximumPoolSize=10
# 最小空闲连接数
minimumIdle=5
# 连接超时时间(毫秒)
connectionTimeout=30000
# 空闲连接超时时间(毫秒)
idleTimeout=600000
# 最大生存时间(毫秒)
maxLifetime=1800000

连接测试:

    @Testpublic void TextHiaki() throws Exception{//1,配置连接池HikariConfig hikariConfig = new HikariConfig();hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306");hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");hikariConfig.setUsername("root");hikariConfig.setPassword("root");hikariConfig.setMaximumPoolSize(30);//最大连接数hikariConfig.setMinimumIdle(10);    //最小连接数//连接超时时间从连接池中获取一个连接最大等待多久时间,单位毫秒hikariConfig.setConnectionTimeout(3000);//2.通过配置类生成HikariCP连接池对象HikariDataSource dataSource = new HikariDataSource(hikariConfig);System.out.println(dataSource.getConnection());}

输出显示

在这里插入图片描述


4,DBCP数据库连接池

jar包资源获取 链接:

https://pan.baidu.com/s/1x4gKgfGL07-J3zTe9Ph17w?pwd=0101

同样需要添加在项目中,如下:
在这里插入图片描述
添加配置文件:

url=jdbc:mysql://localhost:3306/sciencedb
driverClassName=com.mysql.cj.jdbc.Driver
username=root
password=root
initialSize=10
maxActive=30
maxWait=3000

连接测试

@Testpublic void testDBCP() throws Exception{// 创建一个Properties对象Properties properties = new Properties();// 创建一个FileInputStream对象,用于读取src\\dbcp.properties文件FileInputStream fileInputStream= new FileInputStream("src\\dbcp.properties");// 使用FileInputStream对象读取文件,并将文件内容加载到properties对象中properties.load(fileInputStream);// 使用properties对象创建一个BasicDataSource对象BasicDataSource dataSource = BasicDataSourceFactory.createDataSource(properties);// 打印dataSource对象创建的连接System.out.println(dataSource.getConnection());}

输出显示

在这里插入图片描述


✨最后✨

总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!
如有问题,欢迎评论区批评指正😁

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

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

相关文章

计算机基础:网络基础

目录 一.网线制作 1.制作所需要工具 网线制作标准 ​编辑 2.水晶头使用 3.网线钳使用 4.视频教学 二.集线器、交换机介绍 1.OSI七层模型 2.TCP/IP四层参考模型 3.集线器、交换机。路由器介绍 集线器 交换机 路由器 区别 三.路由器的配置 1.路由器设置 说明书 设…

智能优化算法应用:基于水基湍流算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于水基湍流算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于水基湍流算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.水基湍流算法4.实验参数设定5.算法结果6.…

Python:正则表达式---贪婪匹配

在正则表达式中&#xff0c;贪婪匹配是指匹配尽可能多的字符&#xff0c;而非贪婪匹配&#xff08;也称为懒惰匹配或最小匹配&#xff09;则是匹配尽可能少的字符。 .* 表示匹配任意数量的任意字符&#xff08;除换行符外&#xff09;。贪婪匹配会将尽可能多的字符都作为匹配结…

macOS 安装 oh-my-zsh 后 node 报错 command not found : node

最近为了让终端中显示 git 分支的名称&#xff0c;安装了 oh-my-zsh &#xff0c;安装之后呢&#xff0c;我原先安装的 Volta、 node 都没法用了&#xff0c;报错如下&#xff1a; 这时候粗略判断应该是系统变量出了问题&#xff0c;oh-my-zsh 的变量文件是 ~/.zshrc&#xff0…

变分自动编码器【03/3】:使用 Docker 和 Bash 脚本进行超参数调整

一、说明 在深入研究第 1 部分中的介绍和实现&#xff0c;并在第 2 部分中探索训练过程之后&#xff0c;我们现在将重点转向在第 3 部分中通过超参数调整来优化模型的性能。要访问本系列的完整代码&#xff0c;请访问我们的 GitHub 存储库在GitHub - asokraju/ImageAutoEncoder…

Linux(二)常用命令

文章目录 一、文件管理命令1.1 chmod1.2 chown1.3 cat1.4 cp1.5 find1.6 head1.7 tail1.8 less1.9 more1.10 mv1.11 rm1.12 touch1.13 vim1.14 >和>>1.15 scp1.16 ln1.17 怎么用命令查看日志 二、文档管理命令2.1 grep2.2 wc2.3 echo 三、磁盘管理命令3.1 cd3.2 df3.3…

短视频账号矩阵系统3年独立开发正规接口源码搭建部署开发

一、矩阵系统源码主要有三种框架&#xff1a; 短视频账号矩阵源码的框架有很多种&#xff0c;以下列举其中几种&#xff1a; 1. **星图矩阵**&#xff1a;星图矩阵是抖音官方向商家提供的短视频广告推广平台&#xff0c;是抖音官方的赚钱工具。商家可利用星图矩阵进行广告推广…

适用于车载电动升窗器的解决方案

升窗器是指避免车主忘记关窗的自动关窗装置&#xff0c;主要通过电子模块加认组合&#xff0c;利用主机上的芯片里面设定的程序完成检测功能&#xff0c;使自动升窗步骤顺利完成。 ■ 基于ACM32F403系列MCU ■ 高性价比软件控制方案&#xff0c;高算力 ■ MCU内置2路CAN总线&a…

为什么项目管理工具需要项目财务信息?

在讨论项目时&#xff0c;钱是绕不开的话题。 资金是项目管理中最重要的因素之一&#xff0c;与范围和时间并列&#xff0c;三者共同构成了 “三重约束”。例如&#xff0c;如果缩短项目时间&#xff0c;就必须增加成本。 如果无法清楚了解开支及其对项目的影响&#xff08;反…

Python接口自动化测试:断言封装详解

前言 在进行API接口测试时&#xff0c;断言起着至关重要的作用。断言是用于验证预期结果与实际结果是否一致的过程。在Python中&#xff0c;我们可以利用一些库来实现断言功能。 1. 安装必要的库 在Python中&#xff0c;我们主要会使用两个库&#xff1a;requests和jsonpath…

基于 SOAP 的 Web 服务 是什么服务

基于 SOAP 的 Web 服务是一种网络服务&#xff0c;它使用简单对象访问协议&#xff08;SOAP&#xff09;作为通信协议。SOAP 是一种基于 XML 的协议&#xff0c;用于在网络上交换结构化信息。基于 SOAP 的 Web 服务通常用于实现跨网络的远程过程调用&#xff08;RPC&#xff09…

红队打靶练习:WINTERMUTE: 1

前言 网络扫描&#xff08;Nmap、netdiscover&#xff09; HTTP 服务枚举 使用电子邮件日志文件在浏览器中进行目录遍历 利用 SMTP RCPT 选项中的操作系统命令注入 生成 PHP 后门 (Msfvenom) 执行RCPT选项中嵌入的后门 反向连接&#xff08;Metasploit&#xff09; 导入 pytho…

Poi实现复杂Excel导出,理解POI操作Excel思路!!!

前言 对于简单excel报表导出&#xff0c;有很多简单的工具如easypoi&#xff0c;而且现在网上已经有很多工具类整合easypoi使用起来非常方便。但是简单的弊端往往无法适配一些负责场景&#xff0c;而我们实际生产中面临的都是客户自定以的一个负责报表导出&#xff0c;这是利用…

嵌入式开发是否会重复Java的结果?

今日话题&#xff0c;嵌入式开发是否会重复Java的结果&#xff1f;嵌入式开发与Java开发在性质和稳定性上有一些不同&#xff0c;因此不太容易出现与Java相似的结果。嵌入式开发通常属于第二产业&#xff0c;主要涉及制造业领域&#xff0c;如电子、机械&#xff08;汽车&#…

Android-----res资源文件夹

1 res资源文件夹 res目录 assets目录 两者的区别在于&#xff1a; res目录下所有的资源文件都会在R.java文件下生成对应的资源id&#xff0c;而assets目录并不会&#xff1b;res目录我们可以直接通过资源id访问到对应的资源&#xff1b;而assets目录则需要我们通过AssetManag…

RTDETR论文快速理解和代码快速实现(训练与预测)

文章目录 前言一、摘要二、论文目的三、论文贡献四、模型结构1、模型整体结构2、backbone结构3、neck结构4、混合编码器(neck) 五、RTDERT模型训练(data-->train)1、环境安装2、训练1、数据准备2、数据yaml文件3、训练代码4、训练运行结果 3、推理1、推理代码2、推理运行结果…

基于web的楼房销售系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本楼房销售系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

嵌入式MCU和SOC之间的区别是什么?

今日话题&#xff0c;嵌入式MCU和SOC之间的区别是什么&#xff1f;表面上看&#xff0c;MCU代表嵌入式微控制器&#xff0c;而SOC代表片上系统&#xff0c;似乎只是嵌入式系统的不同称谓。然而&#xff0c;在实际的研发和产品设计中&#xff0c;你会发现它们在软硬件层面存在显…

MySQL数据库 约束

目录 约束概述 外键约束 添加外键 删除外键 删除/更新行为 约束概述 概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 目的&#xff1a;保证数据库中数据的正确、有效性和完整性。 分类: 注意&#xff1a;约束是作用于表中字段上…

【实战】如何在Docker Image中轻松运行MySQL

定义 使用Docker运行MySQL有许多优势。它允许数据库程序和数据分离&#xff0c;增强了数据的安全性和可靠性。Docker Image的轻便性简化了MySQL的部署和迁移&#xff0c;而Docker的资源隔离功能确保了应用程序之间无冲突。结合中间件和容器化系统&#xff0c;Docker为MySQL提供…