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>

连接测试:

 @Test
    public 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

连接测试:

    @Test
    public 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

连接测试

@Test
    public 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.mfbz.cn/a/261115.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HuggingFace下载模型

目录 方式一&#xff1a;网页下载 方式二&#xff1a;Git下载 方式一&#xff1a;网页下载 方式二&#xff1a;Git下载 有些模型的使用方法页面会写git clone的地址&#xff0c;有些没写&#xff0c;直接复制网页地址即可 网页地址&#xff1a; ​https://huggingface.co/…

李飞飞吴恩达等 2024 年 AI 十大预测!GPU算力短缺,AI 智能体一年内大爆发?

2023 这个大模型爆发的元年即将过去&#xff0c;展望未来&#xff0c;比尔盖茨&#xff0c;李飞飞&#xff0c;吴恩达等人对 2024 年人工智能的发展作出了自己的预测。 2023&#xff0c;可以说是人工智能的春天。 在过去的一年里&#xff0c;ChatGPT 成为家喻户晓的名字&#…

[ZJCTF 2019]NiZhuanSiWei1

[ZJCTF 2019]NiZhuanSiWei1 预测试 打开网页就是代码&#xff1a; <?php $text $_GET["text"]; $file $_GET["file"]; $password $_GET["password"]; if(isset($text)&&(file_get_contents($text,r)"welcome to the zjct…

【Spring实战】创建第一个项目

文章目录 使用 Spring Initializr 创建第一个项目1. 打开官网2. 填写信息3. 生成工程4. 解压工程5. 导入 IDEA6. 编写 Hello world7. 启动项目8. 访问验证9. 详细代码最后 Spring 是一个强大且广泛使用的 Java 开发框架&#xff0c;提供了全面的基础设施和工具&#xff0c;用于…

移动安全APP--Frida+模拟器,模拟器+burp联动

最近测APP被通报了&#xff0c;问题点测得比较深&#xff0c;涉及到frida和burp抓包&#xff0c;一般在公司可能会有网络的限制&#xff0c;手机没办法抓包&#xff0c;我就直接在模拟器上试了&#xff0c;就在这记录一下安装过程。 目录 一、Frida安装 二、burp与逍遥模拟器…

Lammps错误:domain too large for neighbor bins

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 更 多 \color{blue}{多} 多 精 \color{orange}{精} 精 彩 \color{green}{彩} 彩&#xff01; 主要专栏内容包括&#xff1a; †《LAMMPS小技巧》&#xff1a; ‾ \textbf…

锂供应市场进入了年度议约季,价格或将进一步下调 | 百能云芯

随着锂价在今年的大跌&#xff0c;锂供应市场进入了年度议约季。目前&#xff0c;锂生产商正与主要客户展开讨论2024年的合约&#xff0c;主要集中在亚洲市场。不同于过去几年电动车热潮带来的销售增长&#xff0c;此次的谈判显示出锂市场将维持相对平稳的态势。然而&#xff0…

RTrPPG

研究背景 心率 (HR) 和脉搏率变异性 (PRV) 是允许分析心脏行为的两个生理参数。心率监测可以通过接触式和非接触式的两种方法进行。通常用于测量 HR 和 PRV 的两种接触式技术是心电图 (ECG) 和光电容积脉搏波 (PPG)。 ECG 测量由心脏活动引起的电场。另一方面&#xff0c;PPG …

c语言:从函数中返回多个变量

从函数中返回一个值可以使用返回值&#xff0c;但是如果要返回多个值呢&#xff1f; 你肯定想到了让被调函数修改主调函数内变量的方法---将指针作为参数传递到被调函数中。就像scanf函数那样。 scanf("%d%d%d", &a, &b, &c); // scanf从键盘读入3个…

React网页转换为pdf并下载|使用jspdf html2canvas

checkout 分支后突然报错&#xff0c;提示&#xff1a; Cant resolve jspdf in ... Cant resolve html2canvas in ... 解决方法很简单&#xff0c;重新 yarn install 就好了&#xff0c;至于为什么&#xff0c;我暂时也不知道&#xff0c;总之解决了。 思路来源&#xff1a; 先…

Ubuntu 常用命令之 passwd 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 在Ubuntu系统中&#xff0c;passwd命令用于更改用户的密码。系统管理员可以使用此命令更改任何用户的密码&#xff0c;而普通用户只能更改自己的密码。 passwd命令的参数如下 -l, --lock&#xff1a;锁定密码&#xff0c;使账户…

亚信安慧AntDB数据库开启分布式数据库的新篇章

AntDB-CE社区版是亚信科技AntDB数据库的首个社区版产品&#xff0c;它的诞生标志着AntDB数据库向更广泛的市场和用户群体开放&#xff0c;具有里程碑式的意义。AntDB-CE社区版不仅具备完整、易用、兼容度高的企业级分布式数据库产品特性&#xff0c;还采用了Share-Nothing的无共…

某电子文档安全管理系统 SQL注入漏洞复现

漏洞介绍 亿赛通电子文档安全管理系统 (简称: CDG)是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&#xff0c;对电子文档进行全生命周期防护…

期货平仓日历(期货平仓日期汇总)

什么是期货平仓日历&#xff1f; 期货是一种高风险高收益的投资品种。而期货交易不同于股票等其他投资品种的交易&#xff0c;期货交易需要在一定时间内才能买卖。而期货平仓日历就是指期货交易中规定的所有合约的平仓日期汇总。 常见期货平仓日期和时间&#xff1f; 不同的…

阿里云大模型数据存储解决方案,为 AI 创新提供推动力

云布道师 随着国内首批大模型产品获批名单问世&#xff0c;百“模”大战悄然开启。在这场百“模”大战中&#xff0c;每一款大模型产品的诞生&#xff0c;都离不开数据的支撑。如何有效存储、管理和处理海量多模态数据集&#xff0c;并提升模型训练、推理的效率&#xff0c;保…

uniapp uview1.0 页面多个upload上传、回显之后处理数据

<view class"img-title w-s-color-3 f-28 row">商品图片</view><u-upload ref"images" :header"header" :file-list"fileListImages" :action"action" name"iFile" icon-name"camera"u…

Modbus-ASCII数据帧

Modbus-ASCIl传输模式中&#xff0c;每个字节均以ASCI编码&#xff0c;实际报文中1个字节会以两ASCIl字符发送&#xff0c;因此这种模式比Modbus-RTU模式效率要低。 例如报文数据 x5B "5""B" X35 X42 . 数据帧格式如下: 从ASCI报文帧可以看出&#xff0…

混凝土强度达到多少才可以拆模板

混凝土拆模的时间取决于多种因素&#xff0c;包括混凝土的强度、环境条件、水泥类型、混凝土配方、模板类型及结构特点等。一般来说&#xff0c;混凝土拆模的基本准则是在混凝土达到足够的强度以承受自重和施工荷载时进行。这个强度通常是指混凝土达到其设计强度的一定比例。在…

0x43 线段树

0x43 线段树 线段树&#xff08;Segment Tree&#xff09;是一种基于分治思想的二叉树结构&#xff0c;用于在区间进行信息统计。与按照二进制位&#xff08;2的次幂&#xff09;进行区间划分的树状数组相比&#xff0c;线段树是一种更加通用的结构&#xff1a; 1.线段树的每…

探讨小鹏汽车CAN通讯协议分析破解过程数据研究技术应用

当前新能源电动汽车设计日益复杂&#xff0c;为提高舒适性、功能性、提升性能和确保更高的安全性&#xff0c;很多汽车的设计中融入了更复杂的功能。包括了雷达、激光雷达、自适应巡航、L2以上自动驾驶系统&#xff0c;高级驾驶辅助系统、盲区监测等等。安装在汽车上的传感器和…
最新文章