数据库之连接池Druid

Druid是一个由阿里巴巴开源的高性能数据库连接池组件,它在许多项目中都是首选的连接池实现。Druid不仅提供了高效的连接管理,还具备丰富的监控和统计功能,以及强大的安全特性。

一、功能介绍

1、高效连接管理

Druid采用了高效的连接管理机制,可以快速地创建和回收数据库连接,从而减少了连接的创建和销毁带来的性能开销。通过连接复用机制,Druid可以在多个请求之间复用相同的连接,进一步减少了频繁创建和关闭连接的成本。

2、详细的监控信息

Druid提供了详细的监控信息,包括连接池的状态、SQL执行的统计信息等,这有助于性能调优和问题诊断。开发人员可以通过这些监控信息了解应用程序的性能瓶颈,并据此进行优化。

3、丰富的配置选项

Druid提供了大量的配置选项,可以根据项目的实际需求进行细致的调整,以适应不同的运行环境。这些配置选项包括连接池大小、最大活跃连接数、初始化连接数等,通过灵活的配置可以满足各种复杂的应用场景。

4、安全特性

Druid连接池内置了防SQL注入功能,可以有效地防止SQL注入攻击。此外,它还支持自定义过滤器,可以扩展Druid的功能,实现特定的业务逻辑。

5、强大的扩展性

Druid支持动态加载配置文件,可以在不重启应用的情况下更改连接池的配置。它还支持插件化设计,可以根据需要选择安装不同的插件,增强其功能。

6、良好的集成性

Druid可以很方便地与Spring、MyBatis等主流框架集成,降低开发者的使用门槛。此外,它还支持与各种监控工具(如Prometheus、Grafana)集成,实现对数据库操作的实时监控。

7、广泛的社区支持

由于其优秀的特性和广泛的应用,Druid拥有庞大的用户基础和活跃的社区支持。遇到问题时,开发者很容易找到解决方案。

二、使用场景

Druid数据库连接池组件适用于多种场景,以下是一些主要的应用场景:

1. 高并发的互联网应用

  • 电子商务:在电商应用中,需要处理大量的数据库连接和查询,如用户信息、商品信息、订单信息等。Druid通过优化数据库连接的使用方式,可以显著提高应用程序的性能和响应速度。
  • 社交媒体:社交媒体平台需要处理大量的用户交互数据,如帖子、评论、点赞等。Druid的高并发处理能力能够确保这些交互的实时性和流畅性。
  • 金融系统:金融系统对数据的实时性和准确性要求极高,如股票交易、支付系统等。Druid能够提供稳定、高效的数据库连接服务,确保金融系统的稳定运行。

2. 企业级应用

  • 复杂数据库连接环境:在大型企业中,数据库连接环境通常比较复杂,包括多种数据库类型、多种连接方式等。Druid提供了灵活的数据源配置方式,能够支持多种数据库类型和连接方式,方便开发人员进行管理和优化。
  • 数据库监控和管理:Druid提供了丰富的监控功能,如连接池状态监控、SQL执行分析、慢查询记录等。这些功能可以帮助开发人员实时了解数据库连接池的运行状态,及时发现和解决问题。

三、Java代码示例

以下是一个使用Druid连接池连接数据库的Java示例代码,展示了连接池的配置、使用和优化等方面。

1. 添加Druid依赖

首先,需要在Maven项目的pom.xml文件中添加Druid依赖:

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

这个依赖包用于引入Druid连接池库。

2. 配置Druid连接池

接下来,在应用程序的配置文件中配置Druid连接池。例如,在application.properties文件中添加以下配置:

# 数据源配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=password# 连接池配置
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.filters=stat,wall,slf4j

这些配置信息包括数据库连接的基本信息(如URL、用户名和密码)以及连接池的一些常用配置(如初始连接数、最小空闲连接数、最大活跃连接数等)。

3. 编写Druid工具类

为了更方便地使用Druid连接池,可以编写一个Druid工具类,封装获取连接、关闭连接等操作。以下是一个简单的Druid工具类示例:

import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection;
import java.sql.SQLException;public class DruidUtils {private static DruidDataSource dataSource;static {dataSource = new DruidDataSource();dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");dataSource.setUsername("root");dataSource.setPassword("password");dataSource.setInitialSize(5);dataSource.setMinIdle(5);dataSource.setMaxActive(20);dataSource.setMaxWait(60000);dataSource.setTimeBetweenEvictionRunsMillis(60000);dataSource.setMinEvictableIdleTimeMillis(300000);dataSource.setValidationQuery("SELECT 1");dataSource.setTestWhileIdle(true);dataSource.setTestOnBorrow(false);dataSource.setTestOnReturn(false);dataSource.setPoolPreparedStatements(true);dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);dataSource.setFilters("stat,wall,slf4j");}public static Connection getConnection() throws SQLException {return dataSource.getConnection();}public static void close(Connection conn) {if (conn != null) {try {conn.close(); // 归还连接给连接池} catch (SQLException e) {e.printStackTrace();}}}
}

这个工具类创建了一个DruidDataSource对象,并设置了数据库连接和连接池的属性。通过getConnection方法可以获取数据库连接,close方法用于关闭连接(实际上是将连接归还给连接池)。

4. 使用Druid连接池

现在,可以在应用程序中使用Druid连接池来获取数据库连接并执行SQL语句。以下是一个简单的示例:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class DruidDemo {public static void main(String[] args) {Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {conn = DruidUtils.getConnection();String sql = "SELECT * FROM mytable";pstmt = conn.prepareStatement(sql);rs = pstmt.executeQuery();while (rs.next()) {// 读取数据操作System.out.println(rs.getString("column_name"));}} catch (SQLException e) {e.printStackTrace();} finally {try {if (rs != null) {rs.close();}if (pstmt != null) {pstmt.close();}if (conn != null) {DruidUtils.close(conn);}} catch (SQLException e) {e.printStackTrace();}}}
}

在这个示例中,首先通过DruidUtils.getConnection方法获取数据库连接,然后执行SQL查询语句,并读取查询结果。最后,在finally块中关闭结果集、预处理语句和数据库连接(实际上是将连接归还给连接池)。

5. 监控和统计

Druid提供了丰富的监控和统计功能,可以帮助开发人员更好地了解应用程序的性能。可以通过在Web应用中集成Druid的监控组件来查看连接池的使用情况。

首先,需要在Spring Boot的配置类中配置Druid的监控Servlet:

import com.alibaba.druid.support.http.ResourceFilter;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class DruidConfig {@Beanpublic ServletRegistrationBean<StatViewServlet> statViewServlet() {ServletRegistrationBean<StatViewServlet> srb = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");srb.addInitParameter("allow", "127.0.0.1");srb.addInitParameter("deny", "192.168.1.100");srb.addInitParameter("loginUsername", "admin");srb.addInitParameter("loginPassword", "admin");return srb;}@Beanpublic ServletRegistrationBean<ResourceFilter> resourceFilter() {ServletRegistrationBean<ResourceFilter> srb = new ServletRegistrationBean<>(new ResourceFilter());srb.addUrlPatterns("/druid/*");return srb;}
}

四、总结

Druid是阿里巴巴开源的高性能数据库连接池组件,广泛应用于高并发互联网应用和企业级项目中。它提供了高效的连接管理、详细的监控信息、丰富的配置选项和安全特性。Druid支持快速创建和回收数据库连接,减少性能开销,并通过连接复用机制降低频繁连接的成本。其监控功能帮助开发者实时了解数据库状态,优化性能。Druid还内置防SQL注入功能,增强安全性。此外,它易于与Spring等框架集成,支持动态配置和插件扩展。在高并发场景如电商、社交媒体和金融系统中,Druid能显著提升应用性能和响应速度,是企业级应用的首选数据库连接池解决方案。

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

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

相关文章

解析TF-IDF模型公式、应用、优缺点及实战

一、 TF&#xff08;Term Frequency&#xff09;——词频 词频&#xff08;Term Frequency&#xff0c;简称TF&#xff09;是指某个词在文档中出现的次数。它衡量了一个词在某一篇文档中的重要性。TF的计算公式如下&#xff1a; 例如&#xff0c;假设文档d有100个词&#xff0…

【Elasticsearch】初始化默认字段及分词

1、添加分词插件 1&#xff09;在线安装 执行命令 需要指定相同的版本 bin/elasticsearch-plugin.bat install https://get.infini.cloud/elasticsearch/analysis-ik/7.17.24 2&#xff09;离线安装 将安装包解压到 /plugins 目录下 安装包可以从对应的资源处下载 启动成…

云数据库 HBase

HBase 是一个分布式、可扩展的列式 NoSQL 数据库&#xff0c;源自 Google 的 Bigtable 论文&#xff0c;并是 Apache Hadoop 生态系统的一部分。它特别适用于需要处理大规模数据集的场景&#xff0c;尤其是那些要求高吞吐量和低延迟的数据访问。HBase 支持分布式存储&#xff0…

【爬虫】– 抓取原创力文档数据

使用RPA工具&#xff0c;实现针对于原创力中不可下载文档的抓取&#xff0c;可延用于其他类似文库 1 使用工具、环境 影刀RPA、WPS Office、谷歌浏览器&#xff08;非指定&#xff09; 2 代码流程 3 关键点 此方案只适合抓取非VIP即可预览全文的文档&#xff0c;抓取下来的数…

【burp】burpsuite基础(八)

Burp Suite基础&#xff08;八&#xff09; 声明&#xff1a;该笔记为up主 泷羽的课程笔记&#xff0c;本节链接指路。 警告&#xff1a;本教程仅作学习用途&#xff0c;若有用于非法行为的&#xff0c;概不负责。 ip伪装 安装组件jython 下载好后&#xff0c;在burp中打开扩展…

输电线路故障测距研究

故障分析法容易受到过渡电阻、故障类型等因素的影响&#xff0c;从而造成测距误差较大。 行波法不受电力系统运行方式的影响&#xff0c;得到了广泛的应用。波头信息的提取方法主要有&#xff1a;小波变换、希尔伯特黄变换、TT变换等。 智能测距法逐渐被应用于输电线路故障测…

WEB安全 PHP学习

PHP基础 PHP编码显示问题 header ("Content-type: text/html; charsetgb2312"); header("Content-Type: text/html;charsetutf-8"); windows需要使用gbk编码显示 源码是 <?php header ("Content-type: text/html; charsetgb2312"); sys…

【配置查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

QT模型/视图结构:ListModel与TableModel

简介 模型/视图&#xff08;model/view&#xff09;结构是进行数据存储和界面展示的一种编程结构。此种方式将数据的存储与显示进行了解耦&#xff0c;视图组件显示模型中的数据&#xff0c;在视图组件里修改的数据会被自动保存到模型里。模型的数据来源可以是内存中的字符串列…

Linux系统 —— 进程系列 - 进程的概念,PCB与PID和fork

目录 1. 进程的基本概念与基本操作 1.1 总结&#xff1a;什么才是进程 2. 描述进程-PCB&#xff08;process control block&#xff09; 2.1 task_ struct 2.2 task_ struct内容分类 2.3 组织进程 3. PID 获取当前进程PID - getpid 获取父进程PID - getppid 如何查看…

模型训练数据-MinerU一款Pdf转Markdown软件

模型训练数据-MinerU一款Pdf转Markdown软件-说明 简介&#xff1a; MinerU是什么 MinerU是上海人工智能实验室OpenDataLab团队推出的开源智能数据提取工具&#xff0c;专注于复杂PDF文档的高效解析与提取。MinerU能将包含图片、公式、表格等元素的多模态PDF文档转化为易于分析…

第32天:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

时间轴&#xff1a; 32天主要学习内容&#xff1a; 1、JavaEE-HTTP-Servlet技术 2、JavaEE-数据库-JDBC&Mybatis java技术使用历史&#xff08;2023 &#xff09;&#xff1a; JavaEE-HTTP-Servlet&路由&周期: java学习范围&#xff1a; 3、Java: 功能:数据…

LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型 Matlab代码注释清晰。 程序设计 完整程序和数据获取方式&#xff1a;私信博主回复LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型&#xff08;Matlab&#…

D91【python 接口自动化学习】- pytest基础用法

day91 pytest的setup&#xff0c;setdown详解&#xff08;三&#xff09; 学习日期&#xff1a;20241207 学习目标&#xff1a;pytest基础用法 -- pytest的setup&#xff0c;setdown详解&#xff08;三&#xff09; 学习笔记&#xff1a; setup、teardown详解&#xff08;三…

Spring事务的一道面试题

每次聊起Spring事务&#xff0c;好像很熟悉&#xff0c;又好像很陌生。本篇通过一道面试题和一些实践&#xff0c;来拆解几个Spring事务的常见坑点。 原理 Spring事务的原理是&#xff1a;通过AOP切面的方式实现的&#xff0c;也就是通过代理模式去实现事务增强。 具体过程是&a…

【无标题】建议用坚果云直接同步zotero,其他方法已经过时,容易出现bug

created: 2024-12-06T16:07:45 (UTC 08:00) tags: [] source: https://zotero-chinese.com/user-guide/sync author: 数据与文件的同步 | Zotero 中文社区 Excerpt Zotero 中文社区&#xff0c;Zotero 中文维护小组&#xff0c;Zotero 插件&#xff0c;Zotero 中文 CSL 样式 数…

室联人形机器人:家政服务任务结构化、技术要点、深入应用FPGA的控制系统框架设计(整合版)

目录&#xff1a; 0 引言 1 人形机器人对室内家政服务任务的结构化 1.1人形机器人在室内家政服务中的比较优势 1.1.1 人形机器人拟人性的7个维度 1.1.2 拟人性在室内家政服务工作中的比较优势 1.1.3 潜在的重要用户&#xff1a;宠物爱好者 1.2 居所室内环境的特征与结构…

基于stm23的智慧宿舍系统 (DAY10)_小程序

好久没记录开发进度了&#xff0c;今天小程序差不多开发完了&#xff0c;UI这块算是比较常见了&#xff0c;主要功能是能连接onenet查看设备上传的数据&#xff0c;同时也能对设备进行一些控制下面是几个主要的函数&#xff0c;功能比较简单 wx.request({url: ${apiBaseUrl}/t…

ruoyi-nbcio为安全起见actuator为仅暴露health端点

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

Vant UI +Golang(gin) 上传文件

前端基本用法&#xff1a;点击查看 实现代码&#xff1a; const afterRead (file) > {console.log(file);//set content-type to multipart/form-dataconst formData new FormData();formData.append("file", file.file);request.POST("/api/v1/users/up…