当前位置: 首页 > news >正文

池的概念以及数据库连接池 Druid

1.池的概述

池就相当于一个共享资源,是对资源的整合和调配,节省存储空间,当需要的时候可以直接在池中取,用完之后再还回去。

为什么需要连接池

假如没有连接池,我们操作数据库的流程如下:

  1. 应用程序使用数据库驱动建立和数据库的 TCP 连接 ;
  2. 用户进行身份验证 ;
  3. 身份验证通过,应用进行读写数据库操作 ;
  4. 操作结束后,关闭 TCP 连接 。

连接池是一个存放数据库连接对象的集合,应用程序在启动时会创建多个数据库连接对象,并将它们放入连接池中。当有客户端请求到达时,应用程序会从连接池中获取一个连接对象来为客户端提供服务。请求处理完成后,客户端会通过调用关闭方法将连接对象归还给连接池。这种设计可以有效地管理数据库连接的分配和释放,提高系统的性能和资源利用率。

JDBC连接池是一种常见的数据库连接管理方式,通过预先创建一组数据库连接对象并放入池中,以供应用程序随时使用。相比于直接频繁创建连接的方式,使用连接池可以提高效率和性能。

以下是使用JDBC连接池的一般流程:

  1. 获取数据源对象:通常使用标准的数据源接口javax.sql.DataSource,其中定义了获取数据库连接的方法。
  2. 从数据源获取连接:通过调用getConnection()方法获取数据库连接对象。
  3. 执行SQL操作:使用获取到的连接对象执行SQL查询或更新操作。
  4. 处理查询结果:对查询结果进行处理,例如遍历结果集并提取数据。
  5. 关闭资源:在完成操作后,需要关闭ResultSet、PreparedStatement和Connection等资源,以释放数据库连接和避免资源泄漏。

常见的JDBC连接池包括HikariCP、C3P0和Druid等。其中,Druid是阿里巴巴开源的数据库连接池库,提供了丰富的连接池管理和监控功能,因此在实际应用中也得到了广泛的应用。

1、配置Druid数据源

DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
dataSource.setUsername("yourusername");
dataSource.setPassword("yourpassword");
dataSource.setInitialSize(5); // 初始连接池大小
dataSource.setMinIdle(5); // 最小空闲连接数
dataSource.setMaxActive(20); // 最大活动连接数
dataSource.setValidationQuery("select 1 from dual");  // 心跳的 Query
dataSource.setMaxWait(60000); // 最大等待时间
dataSource.setTestOnBorrow(true); // 验证连接是否有效

2、使用数据库连接

Connection connection = dataSource.getConnection();
//使用连接执行数据库操作
// TODO 业务操作
// 使用后关闭连接连接
connection.close();

3、关闭数据源

dataSource.close();

 

相关文章:

  • 深入理解 Mysql 分层架构:从存储引擎到查询优化器的内部机制解析
  • 1738. 找出第 K 大的异或坐标值
  • 嵌入式进阶——舵机控制PWM
  • 辐射度技术在AI去衣中的魅力与科学
  • 基于长短期记忆网络 LSTM 的送餐时间预测
  • 1960-2022年世界银行WDI面板数据(1400+指标)
  • 论文阅读--ActionCLIP
  • Leetcode.560.和为k的子数组
  • python基础(1) -- 基本数据类型与变量
  • SQL Server--死锁
  • SDK——如何快速上手一个接口驱动任务(以iic为例)
  • 基于springboot+vue的4S店车辆管理系统
  • vulnhub靶场之FunBox-8
  • 渗透工具CobaltStrike工具的下载和安装
  • 粤嵌—2024/5/20—三角形最小路径和(✔)
  • Android Volley源码解析
  • codis proxy处理流程
  • E-HPC支持多队列管理和自动伸缩
  • js操作时间(持续更新)
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Linux下的乱码问题
  • PAT A1120
  • REST架构的思考
  • Vue学习第二天
  • 配置 PM2 实现代码自动发布
  • 协程
  • 学习ES6 变量的解构赋值
  • 国内开源镜像站点
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​插件化DPI在商用WIFI中的价值
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • ‌内网穿透技术‌总结
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (1)虚拟机的安装与使用,linux系统安装
  • (3)llvm ir转换过程
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (备份) esp32 GPIO
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (自用)网络编程
  • ****三次握手和四次挥手
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET 8.0 发布到 IIS
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • ::前边啥也没有
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • [012-1].第12节:Mysql的配置文件的使用