JDBC常见的几种连接池使用(C3P0、Druid、HikariCP 、DBCP)(附上代码详细讲解)

Hi i,m JinXiang


⭐ 前言 ⭐

本篇文章主要介绍JDBC常见的几种连接池使用(C3P0、Druid、HikariCP 、DBCP)以及部分理论知识


🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁

🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言


目录

⭐什么是连接池?

⭐为什么要使用连接池?

⭐使用连接池

🍧连接池的常见基本配置

⭐连接池的4种常见配置方法

🍧1、理论知识

🍧2、代码实操

1. C3P0

2. Druid

3. HikariCP

4. DBCP


⭐什么是连接池?

连接池(Connection Pool)是一种数据库连接管理技术,它可以对数据库连接进行复用,从而减少了重复创建和删除连接的开销,提高了系统的性能和可扩展性。

  • 1、连接池在应用程序启动时创建一定数量的数据库连接,将这些连接保存在内存中,等待应用程序需要时提供给它,应用程序在使用完连接后将其放回连接池,而不是直接关闭它。当连接池中的连接数量不足时,连接池会自动创建新的连接,直到达到连接池的最大连接数为止。
  • 2、连接池的主要作用是提高系统的性能和可扩展性,它可以减少数据库连接的创建和销毁次数,避免了频繁的网络交互和数据库连接的资源消耗,同时也方便了系统的升级和扩展。但连接池的缺点是会占用一定的内存和资源,并且在高并发环境中可能会出现连接池满的情况,需要合理设置连接池的参数,以便在保证系统性能的情况下,最大限度地利用连接池的资源。

⭐为什么要使用连接池?

使用连接池有以下几个优点:

  • 1、提高系统性能:连接池可以减少每次请求数据库时创建和销毁连接的开销,提高了系统的响应速度和吞吐量。
  • 2、节省资源:连接池可以复用已经创建的连接,避免了频繁的创建和销毁连接所带来的资源消耗。
  • 3、方便管理和维护:连接池可以统一管理和维护连接,包括连接超时、连接池大小、连接监控等参数,方便系统的管理和维护。
  • 4、提高系统可扩展性:使用连接池可以方便地扩展系统的并发访问能力,提高了系统的可扩展性和可靠性。
  • 5、减少数据库压力:连接池可以限制同时连接数据库的数量,避免了数据库被大量请求压垮的情况,提高了数据库的稳定性。
  • 6、优化数据库访问:连接池可以优化数据库访问,包括连接的预处理、优化SQL语句等操作,提高了数据库的性能和稳定性。
  • 7、避免数据连接泄漏:连接池可以防止数据库连接泄漏,保证了系统的安全性和稳定性。

综上所述,连接池是优化系统性能、减轻系统负担、节省系统资源、提高系统可扩展性和保证系统安全性的重要手段。

⭐使用连接池

使用连接池的步骤如下:

  • 1. 导入连接池的jar包:在项目中导入连接池的jar包,如c3p0、dbcp、HikariCP等。
  • 2. 配置连接池参数:配置连接池的相关参数,如连接池的大小、最小连接数、最大连接数、超时时间、等待时间等。
  • 3. 获取连接:通过连接池获取连接对象。如果连接池中有可用的连接对象,则直接从连接池中获取;否则等待连接池创建新的连接对象。
  • 4. 使用连接:通过连接对象,可以进行数据库的增删改查操作。
  • 5. 释放资源:使用完毕后,需要将连接对象还回连接池。在关闭连接之前,可以进行相关操作,如提交事务、回滚事务、清除连接上的状态等。

下面是一个使用c3p0连接池的示例:

// 导入c3p0的jar包
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TestC3p0 {// 创建连接池对象private static ComboPooledDataSource dataSource = new ComboPooledDataSource();public static void main(String[] args) throws SQLException {// 获取连接对象Connection conn = dataSource.getConnection();// 执行SQL查询PreparedStatement pst = conn.prepareStatement("SELECT * FROM user WHERE id = ?");pst.setInt(1, 1);ResultSet rs = pst.executeQuery();while (rs.next()) {System.out.println(rs.getInt("id") + " " + rs.getString("name"));}// 关闭连接rs.close();pst.close();conn.close();}
}

在这个示例中,创建了一个c3p0连接池对象,通过调用`getConnection()`方法获取连接对象。在程序执行完毕后,需要将连接对象还回连接池(释放资源)。

🍧连接池的常见基本配置

连接池的4种常见配置方法如下:

1、基本配置:

对于连接池的基本配置,如连接池的名称、用户名、密码、连接URL等,可以通过在配置文件中指定相关属性来完成。例如,在dbcp连接池中,可以通过在`context.xml`文件中增加以下配置来实现基本配置:

<Resource name="jdbc/testdb"auth="Container"type="javax.sql.DataSource"driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/testdb"username="testuser"password="testpass"maxActive="20"maxIdle="10"maxWait="-1"/>
2、连接池大小:

连接池大小决定了连接池中最多同时存在多少个连接对象。在配置文件中,可以通过设置`maxActive`属性来指定连接池的大小。例如,在c3p0连接池中,可以通过以下方式指定连接池大小:

<property name="maxPoolSize">20</property>
3、最大空闲连接数:

最大空闲连接数指的是连接池中最多可以存在多少个空闲的连接对象,这些连接对象并没有被使用,但是可以被立即使用。在配置文件中,可以通过设置`maxIdle`属性来指定最大空闲连接数。例如,在dbcp连接池中,可以通过以下方式指定最大空闲连接数:

<property name="maxIdle">10</property>
4、最大等待时间:

最大等待时间表示当连接池中所有的连接对象都被占用时,新的连接请求需要等待多长时间才能获得连接对象。在配置文件中,可以通过设置`maxWait`属性来指定最大等待时间。例如,在HikariCP连接池中,可以通过以下方式指定最大等待时间:

dataSource.setMaximumPoolSize(20);
dataSource.setMinimumIdle(10);
dataSource.setConnectionTimeout(30000);

除了上面介绍的连接池配置方法以外,还有其他的配置方法,如连接池的自动回收机制、连接池的失败重试机制等。这些配置方法对于优化连接池的性能、稳定性具有重要作用。

⭐连接池的4种常见配置方法

🍧1、理论知识

JDBC常见的几种连接池包括:

  • 1、C3P0:C3P0是一个非常流行的开源连接池。它支持JDBC3规范和JDBC2的标准扩展,具有良好的性能和稳定性。C3P0提供了众多的配置参数,可以满足不同场景下的需求。
  • 2、Druid:Druid是阿里巴巴开发的一个高性能、可扩展、可监控的开源JDBC连接池。Druid支持JDBC和非JDBC数据源,能够监控连接池的状态、性能、使用情况等。Druid还提供了丰富的监控统计功能,可以通过Web界面或API查看连接池的使用情况。
  • 3、HikariCP:HikariCP是一个轻量级、高效的JDBC连接池,具有快速启动和低延迟的特点。HikariCP的设计目标是提供极佳的性能和可靠性,同时尽量减少资源消耗和开销。HikariCP支持各种JDBC驱动程序和数据源。相比于其他连接池,HikariCP配置简单,易于使用。
  • 4、DBCP:DBCP是Apache组织开发的一个开源连接池,支持JDBC1、JDBC2、JDBC3规范和JDBC的扩展API。DBCP提供了许多配置选项,可以调整连接池的性能和稳定性。相比C3P0,DBCP的性能略有下降,但是在一些场景下,DBCP比C3P0更加稳定

以上是常见的四种连接池,每种连接池都有其自身的特点和优势,在选择连接池时需要根据具体业务需求和系统性能需求进行选择。

🍧2、代码实操

1. C3P0

C3P0的使用方法如下,首先需要引入C3P0的jar包:

<dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.5.5</version>
</dependency>

然后在代码中使用以下方式获取连接:

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUser("root");
dataSource.setPassword("123456");
Connection conn = dataSource.getConnection();

其中,ComboPooledDataSource是C3P0提供的数据源,需要设置数据库的相关信息,包括数据库驱动类、JDBC URL、用户名和密码。getConnection()方法用于获取一个数据库连接。

2. Druid

Druid的使用方法如下,首先需要引入Druid的jar包:

<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version>
</dependency>

然后在代码中使用以下方式获取连接:

DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("123456");
Connection conn = dataSource.getConnection();

其中,DruidDataSource是Druid提供的数据源,需要设置数据库的相关信息,包括数据库驱动类、JDBC URL、用户名和密码。getConnection()方法用于获取一个数据库连接。

3. HikariCP

HikariCP的使用方法如下,首先需要引入HikariCP的jar包:

<dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>3.4.5</version>
</dependency>

然后在代码中使用以下方式获取连接:

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test");
config.setUsername("root");
config.setPassword("123456");
config.setDriverClassName("com.mysql.jdbc.Driver");
HikariDataSource dataSource = new HikariDataSource(config);
Connection conn = dataSource.getConnection();

其中,HikariConfig用于设置数据库的相关信息,包括JDBC URL、用户名、密码和驱动类。HikariDataSource是HikariCP提供的数据源,通过config参数初始化。getConnection()方法用于获取一个数据库连接。

4. DBCP

DBCP的使用方法如下,首先需要引入DBCP的jar包:

<dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version>
</dependency>

然后在代码中使用以下方式获取连接:

BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("123456");
Connection conn = dataSource.getConnection();

其中,BasicDataSource是DBCP提供的数据源,需要设置数据库的相关信息,包括数据库驱动类、JDBC URL、用户名和密码。getConnection()方法用于获取一个数据库连接。

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

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

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

相关文章

【实用经验】如何根据CVE编号找到安全补丁

找到对应补丁页面 例如查找编号为 CVE-2019-0708 的漏洞&#xff0c;访问下面链接即可&#xff0c;替换末尾编号可获取其他漏洞更新补丁。 https://msrc.microsoft.com/update-guide/vulnerability/CVE-2019-0708根据实际情况点击右侧补丁链接即可跳转下载 最后根据实际情况下…

高级搜索——ST表,离线RMQ问题

文章目录 前言可重复贡献问题ST表的定义ST表的存储结构ST表的预处理预处理的实现 ST表的区间查询对于k的获取区间查询的实现 OJ链接 前言 对于查询区间最值的方法&#xff0c;我们常用的就是线段树&#xff0c;树状数组&#xff0c;单调队列&#xff0c;而树状数组更适合用于快…

10款必备设计的工具汇总

在当今数字时代&#xff0c;在线绘图软件已经成为创造、设计和表达创造力的重要工具。无论你是专业设计师还是创意爱好者&#xff0c;这些在线绘图软件都将帮助你实现创造力的无限可能性。本文将介绍10个画图设计软件&#xff0c;并分析功能特点、优点&#xff0c;帮助您找到最…

基于Browscap对浏览器工具类优化

项目背景 原有的启动平台公共组件库comm-util的浏览器工具类BrowserUtils是基于UserAgentUtils的&#xff0c;但是该项目最后一个版本发布于 2018/01/24&#xff0c;之至今日23年底&#xff0c;已有5年没有维护更新&#xff0c;会造成最新版本的部分浏览器不能正确获取到浏览器…

机器学习 sklearn 中的超参数搜索方法

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

【Docker二】docker网络模式、网络通信、数据管理

目录 一、docker网络模式&#xff1a; 1、概述 2、docker网络实现原理&#xff1a; 3、docker的网络模式&#xff1a; 3.1、bridge模式&#xff1a; 3.2、host模式&#xff1a; 3.3、container模式&#xff1a; 3.4、none模式&#xff1a; 3.5、自定义网络模式&#xf…

c语言指针详解下

指针下 1 指针与字符串 int main01(){//指针与字符串char a[] "helloworld";//定义了一个字符数组,字符数组内容为helloworld\0//定义一个指针用来保存数组首元素的地址char * p a;printf("%s\n",p);//%s打印一个字符串,要的是首个字符的地址printf(…

MySql概述及其性能说明

MySQL是一种开源的关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff0c;现属于Oracle公司。MySQL是最流行的开源数据库之一&#xff0c;被广泛地应用于Web开发中。MySQL提供了一个高度稳定可靠的数据存储解决方案&#xff0c;同时也可以很容易地跨平台运行。My…

软件中提示找不到msvcp140.dll无法继续执行代码,运行打开软件怎么弄

今天打开CAD提示找不到msvcp140.dll&#xff0c;这是一个很常见的问题&#xff0c;可能是由于系统缺少这个重要的动态链接库文件导致的。本文将介绍五个解决方法&#xff0c;以及msvcp140.dll文件的作用和丢失原因。 一、msvcp140.dll文件的作用 msvcp140.dll是Microsoft Vis…

一对多聊天

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

基于互一致性学习的半监督医学图像分割

Mutual consistency learning for semi-supervised medical image segmentation 基于互一致性学习的半监督医学图像分割背景贡献半监督学习 其它缓解过拟合的方法实验方法损失函数Thinking 基于互一致性学习的半监督医学图像分割 Medical Image Analysis 81 (2022) 102530 背…

Spring AOP带你了解整个流程,让面试官只能仰望

文章目录 一&#xff0c;介绍二&#xff0c;什么是JDK动态代理以及CGLIB代理三&#xff0c;源码流程图小结 一&#xff0c;介绍 提示&#xff1a;解析 A[“JavaConfig”] --> B[“EnableAspectJAutoProxy”]&#xff1a; 在Spring配置中&#xff0c;启用AspectJ自动代理功能…