数据库连接池与Druid【后端 16】
数据库连接池与Druid
在现代软件开发中,数据库连接池作为一种关键的技术手段,被广泛用于提升数据库访问的效率和稳定性。本文将深入探讨数据库连接池的概念、常见实现,并重点介绍我国阿里集团开源的数据库连接池——Druid,以及如何在项目中切换数据库连接池。
什么是数据库连接池?
数据库连接池是一种用于管理数据库连接的技术,它通过预先创建和管理一组数据库连接,使得应用程序能够快速复用这些连接,而非每次需要时都创建新连接。这种方式显著减少了数据库连接的创建和销毁开销,提高了应用程序的性能和资源利用率。
常见的数据库连接池
- HikariCP
- 特点:HikariCP以其高性能和低延迟著称,是目前最受欢迎的Java数据库连接池之一。它采用异步线程池和快速连接池初始化等技术,确保在高负载情况下也能提供稳定的性能。
- 适用场景:适用于高并发、高性能需求的应用程序。
- C3P0
- 特点:C3P0是一个老牌的Java数据库连接池,具有较高的稳定性和可靠性。它支持自动回收连接、测试连接的有效性等功能,并提供了丰富的配置选项。
- 适用场景:适用于需要稳定性和可靠性的应用程序。
- Apache Commons DBCP
- 特点:DBCP是Apache Commons项目的一部分,具有简单易用、配置灵活等特点。它支持连接池的基本功能,如连接回收、连接测试等,并提供了统计信息和自动重连等高级功能。
- 适用场景:适用于需要快速部署和配置的应用程序。
- Druid
- 特点:Druid是阿里巴巴开源的一款高性能Java数据库连接池,它不仅提供了数据库连接管理的功能,还包含了SQL执行监控、SQL解析、慢SQL跟踪等丰富的特性。Druid的高性能和丰富的监控功能,使其成为企业级项目的首选。
- 适用场景:广泛应用于各种规模的企业级项目,特别是需要高性能和全面监控的应用场景。
如何切换数据库连接池
在项目中切换数据库连接池通常涉及以下几个步骤:
- 评估需求:首先评估项目的实际需求,包括性能要求、稳定性要求、监控需求等,以确定最适合的数据库连接池。
- 修改依赖:在项目的构建配置文件中(如Maven的pom.xml或Gradle的build.gradle),将原来的数据库连接池依赖替换为新的连接池依赖。例如,将C3P0替换为Druid,需要添加Druid的依赖项。
- 配置连接池:根据新的连接池文档,配置相应的连接池参数。Druid提供了丰富的配置选项,包括初始化连接数、最大连接数、连接超时时间等,可以根据项目需求进行灵活配置。
- 修改代码:如果项目中直接使用了旧的连接池API,可能需要修改代码以适配新的连接池API。不过,大多数连接池都遵循JDBC规范,因此代码修改通常不大。
- 测试验证:切换连接池后,进行全面的测试验证,确保新的连接池能够正常工作,并满足项目的性能要求。
阿里集团的开源连接池——Druid
Druid作为阿里巴巴开源的数据库连接池,不仅具备高性能和丰富的监控功能,还得到了广泛的社区支持和应用。它提供了全面的SQL监控、解析和慢SQL跟踪功能,帮助开发者快速定位和解决数据库性能问题。
在使用Druid时,开发者可以通过配置文件或编程方式灵活设置连接池的各项参数,以满足不同的应用场景需求。同时,Druid还提供了丰富的监控界面,方便开发者实时监控数据库连接池的运行状态,确保系统的稳定性和性能。
综上所述,数据库连接池是现代软件开发中不可或缺的技术手段,而阿里集团的开源连接池Druid则以其高性能和丰富的监控功能成为众多项目的首选。通过合理选择和配置数据库连接池,可以显著提升数据库访问的效率和稳定性,为应用程序的性能优化提供有力支持。
将项目的数据库连接池换成Druid,通常涉及以下几个详细步骤。以下是一个基于Spring Boot项目的示例流程,但请注意,对于其他类型的Java项目(如Spring MVC、纯Java应用等),基本步骤类似,只是在配置和依赖管理上可能有所不同。
1. 添加Druid依赖
首先,你需要在项目的构建文件中添加Druid的依赖项。以Maven为例,你需要在pom.xml
文件中添加如下依赖(注意替换为最新版本):
<!-- Druid连接池Spring Boot Starter依赖 -->
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>最新版本号</version> <!-- 请访问Maven中央仓库获取最新版本 -->
</dependency> <!-- 对于Spring Boot 3.x及以上版本,可能需要额外添加 -->
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-3-starter</artifactId> <version>最新版本号</version> <!-- 同样,请访问Maven中央仓库获取最新版本 -->
</dependency>
2. 配置Druid连接池
接着,你需要在项目的配置文件(如application.properties
或application.yml
)中配置Druid连接池的参数。以下是一个application.properties
的示例配置:
# 数据源基本配置
spring.datasource.url=jdbc:mysql://localhost:3306/yourdatabase
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # Druid连接池特有配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
spring.datasource.druid.max-wait=10000
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.validation-query=SELECT 1
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
# 其他配置...
3. (可选)配置Druid监控管理后台
如果你希望使用Druid提供的监控管理功能,可以通过配置Servlet和Filter来实现。这通常在Spring Boot项目中通过Java配置类来完成。以下是一个简单的配置示例:
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map; @Configuration
public class DruidConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.druid") public DataSource druidDataSource() { return new DruidDataSource(); } @Bean public ServletRegistrationBean druidServlet() { ServletRegistrationBean registrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*"); Map<String, String> initParams = new HashMap<>(); initParams.put("loginUsername", "admin"); initParams.put("loginPassword", "admin"); // 其他参数配置... registrationBean.setInitParameters(initParams); return registrationBean; } @Bean public FilterRegistrationBean druidWebStatFilter() { FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(new WebStatFilter()); registrationBean.addUrlPatterns("/*"); Map<String, String> initParams = new HashMap<>(); initParams.put("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); // 其他参数配置... registrationBean.setInitParameters(initParams); return registrationBean; }
}
请注意,上述druidServlet
和druidWebStatFilter
的配置是可选的,仅当你需要Druid的监控管理功能时才需要添加。
4. 验证和测试
完成以上步骤后,重新启动你的应用程序,并访问Druid监控管理后台(如果你配置了的话,通常是/druid/
路径)。检查数据库连接池是否已正确配置,并运行一些数据库操作以验证连接池是否按预期工作。
通过以上步骤,你可以将项目的数据库连接池成功换成Druid,并利用其高性能和丰富的监控功能来优化你的数据库访问。
相关文章:

数据库连接池与Druid【后端 16】
数据库连接池与Druid 在现代软件开发中,数据库连接池作为一种关键的技术手段,被广泛用于提升数据库访问的效率和稳定性。本文将深入探讨数据库连接池的概念、常见实现,并重点介绍我国阿里集团开源的数据库连接池——Druid,以及如何…...

C#使用Access数据库使用总结
话说这Access数据库确实是有点年代了,前面在深圳的一家放射医疗公司,数据库用的Access,后面在我的建议下,换成了SQLite。用SQLite多舒服,不用装Runtime,还可以用EF。Access得装Runtime,也用不了…...

使用Dataherald组件进行数据分析:从安装到查询的完整指南
使用Dataherald组件进行数据分析:从安装到查询的完整指南 引言 在当今数据驱动的世界中,能够快速、准确地从数据中获取洞察变得越来越重要。Dataherald是一个强大的工具,它可以帮助开发者和数据分析师更轻松地进行数据查询和分析。本文将详…...

sqlx1.3.4版本的问题
sqlx1.3.4版本存在问题,在调用sqlx的Select方法时,如果传入的dest是一个slice且slice不为空,查询结果将会追加在这个slice已有的元素后面。这位用户认为这个行为是“a little surprising”的,且与json 反序列化的表现不一致&#…...

Rust 编译器使用的 C++ 编译器吗?
Rust编译器并不直接使用C编译器,但它们之间可以存在交互,尤其是在Rust与C进行混合编程时。以下是关于Rust编译器和C编译器之间关系的详细解释: 1. Rust编译器的选择 Rust是一种现代化的系统级编程语言,它需要一个可靠的编译器来…...

Python计算机视觉 第10章-OpenCV
Python计算机视觉 第10章-OpenCV OpenCV 是一个C 库,用于(实时)处理计算视觉问题。实时处理计算机视觉的 C 库,最初由英特尔公司开发,现由 Willow Garage 维护。OpenCV 是在 BSD 许可下发布的开源库,这意味…...

多层感知机 (Multilayer Perceptron, MLP)
多层感知机 (Multilayer Perceptron, MLP) 通俗易懂算法 多层感知机(Multilayer Perceptron,MLP)是一种前馈人工神经网络。它的主要特点是由多层神经元(或节点)组成,包括至少一个隐藏层。MLP 是监督学习的…...

reg和wire的区别 HDL语言
文章目录 数据类型根本区别什么时候要定义wire小结 数据类型 HDL语言有三种数据类型:寄存器数据类型(reg)、线网数据类型(wire)、参数数据类型(parameter)。 根本区别 reg: 寄存器…...

前置声明和头文件之间的关系 问题
出现这些问题的原因是 ORB_SLAM3::MultiGraph 被前置声明了,但在使用的时候,编译器并没有看到 MultiGraph 类的完整定义。前置声明只能用于指针和引用,但如果要访问其成员函数或变量,必须包含完整的类定义。 解决方案步骤&#x…...

Linux02
1.相对路径和绝对路径 cd用于切换目录,对于路径可以用相对路径和绝对路径 例如:cd /home/user/public和cd public效果一样,都是将目录切换到HOME文件夹下的public文件夹 2.特殊路径符 .表示当前目录 ..表示上级目录 ~表示HOME目录 3.m…...

df 命令:显示磁盘空间使用情况
一、df 命令简介 df命令用于显示文件系统的磁盘空间利用情况,包括文件系统的总空间、已用空间、可用空间以及挂载点信息。通过df命令,用户可以快速了解系统中各个文件系统的空间使用情况。 二、df 命令参数 df [选项] [目录/驱动器]选项&am…...

深入解析Go语言的容器包
在Go语言中,container标准包为开发者提供了三个非常有用的数据结构:堆(heap)、链表(list)和环(ring)。这些数据结构的实现分别位于container/heap、container/list和container/ring中…...

STM32 + W5500 实现HTTPS !
两点: 1. 让我们先站在操作系统之上的网络协议栈再之上来思考…… 2. 我们先简单粗暴地理解为:http + (加密)= https 先弄一个简单的HTTP网络客户端,连接服务器并读取默认页面。该应用程序可能如下所示: #include <sys/types.h> #include <sys/socket.h> …...

使用DuckDuckGo搜索API进行高效信息检索:Python实践指南
使用DuckDuckGo搜索API进行高效信息检索:Python实践指南 引言 在当今信息爆炸的时代,快速准确地获取所需信息变得越来越重要。DuckDuckGo作为一个注重隐私的搜索引擎,提供了强大的搜索API,让开发者能够轻松地将搜索功能集成到自…...

UE4_后期处理_后期处理材质四—场景物体描边
一、效果如下图: 二、分析: 回顾复习:在后期处理材质三中,我们通过计算开启自定义深度通道物体的像素点上下左右4个像素SceneTextureCustomDepth深度之和来判断物体的外部(包含物体的边)和内部,…...

华为OD机试 - 推荐多样性(Python/JS/C/C++ 2024 E卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…...

梧桐数据库(WuTongDB):CBO(Cost-Based Optimizer)基于代价的优化器技术简介
CBO(基于代价的优化器,Cost-Based Optimizer)是现代数据库系统中最广泛使用的查询优化器之一。它通过计算执行查询时可能消耗的资源(如CPU、内存、I/O)来选择最优的执行计划,以提高查询性能。 1. CBO 的工…...

深入探索Go语言中的函数:匿名函数、指针参数与函数返回
1. Go语言中的函数 函数是任何编程语言中的核心元素,它们帮助我们将大型程序分解为更小的、易于管理的部分。在Go语言中,函数是通过 func 关键字定义的。理想的函数应当是独立的,完成单一任务。如果你发现某个函数正在执行多个任务ÿ…...

Android12_13左上角状态栏数字时间显示右移动
文章目录 问题场景解决问题 一、基础资料二、代码追踪三、解决方案布局的角度解决更改paddingStart 的默认值设置marginLeft 值 硬编码的角度解决 问题场景 1)早期一般屏幕都是方形的,但是曲面屏,比如:好多车机Android产品、魔镜…...

望繁信科技携流程智能解决方案亮相CNDS 2024新能源产业数智峰会
9月13日,CNDS 2024中国新能源产业数智峰会在北京圆满落幕。本次峰会以“走向数字新能源”为主题,汇聚了来自新能源领域的顶尖领袖、专家学者及知名企业代表,共同探讨数字化技术在新能源行业中的创新应用和发展趋势。上海望繁信科技有限公司&a…...

nginx负载均衡(轮询与权重)
文章目录 1. nginx的介绍2. nginx使用场景3. nginx在windows的下载与安装4. nginx的简单使用5. nginx进行轮询测试6. nginx进行权重测试7. 总结 1. nginx的介绍 Nginx(engine x)是一个高性能的HTTP和反向代理web服务器,同时也是一个开源的、…...

【计算机网络】网络通信中的端口号
文章目录 一、引入端口号二、端口号的作用三、端口号的确定 在TCP/IP协议中,传输层有两个重要的协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP用于提供可靠的数据传输,而UDP则适合用于广播…...

Python 解析 JSON 数据
1、有如下 JSON 数据,存放在 data.json 文件: [{"id":1, "name": "小王", "gender": "male", "score": 96.8}, {"id":2, "name": "小婷", "gender&qu…...

利用LlamaIndex构建ARG本地知识库
文章目录 1. 环境准备2. 启用诊断日志3. 配置本地模型4. 配置本地向量模型5. LlamaIndex全局配置6. 创建 PGVectorStore7. 从数据库加载数据8. 文本分割器: SpacyTextSplitter9. 配置管道10. 创建向量存储索引11 .指定响应模式,以及启用流式响应 在现代的人工智能应…...

PCM的缺点
PCM的主要缺点包括需要较大的数据传输带宽和存储空间,导致无法实现高压缩比,相对较低的数据压缩效率。 PCM(脉冲编码调制)作为一种无损编码技术,虽然能够保留原始信号的完整性,适用于需要高保…...

【C语言】(指针系列四)回调函数+qsort函数
一、回调函数 回调函数就是通过函数指针调用的函数 如果你把函数的指针作为参数传递给另外一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数并不是一个单一的函数实现的,而是在某种情况下,编…...

全面理解tensor编程中矩阵的行和列
经常会在编程中遇到理解矩阵行和列的事情。 1、要明确无论这个张量有多少维度,它的矩阵乘法都只能作用于最后两个维度。 例如: import torcha torch.rand([64, 32, 3, 4]) b torch.rand([64, 32, 3, 4])c torch.matmul(a, b.transpose(2, 3)) # 交…...

【Kubernetes】常见面试题汇总(十)
目录 29.简述 Kubernetes 自动扩容机制? 30.简述 Kubernetes Service 类型? 31.简述 Kubernetes Service 分发后端的策略? 32.简述 Kubernetes Headless Service ? 29.简述 Kubernetes 自动扩容机制? (…...

CSS —— 界面布局
flexbox - 弹性盒子布局(弹性布局) 一维方向,横纵向排列。 采用flex布局的元素,称为 Flex 容器(flex container),简称"容器" flex-direction 用于设置主轴方向;子元素默…...

SpringBoot万级并发-jemeter-Address already in use: connect
一、场景 用Jmeter压力单测接口的时候,发现报 Response code:Non HTTP response code: java.net.BindException Response message:Non HTTP response message: Address already in use: connect 然后我这边是wondows的电脑操作压测的,操作系统win10&…...