springboot 集成Druid的监控数据库连接池的最佳实践

news2024/10/7 6:46:52

免费的chatgpt福利送上
http://124.220.104.235:31105/web/chatgpt

1.数据库连接池介绍

1.1JDBC数据库连接池的必要性

在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤

  • 在主程序(如servlet、beans)中建立数据库连接

  • 进行sql操作

  • 断开数据库连接

这种模式开发,存在的问题:

普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求 一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很 好的重复利用。若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严 重的甚至会造成服务器的崩溃。

对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统 中的内存泄漏,最终将导致重启数据库。(回忆:何为Java的内存泄漏?)

这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内 存泄漏,服务器崩溃。

1.2 数据库连接池技术

为解决传统开发中的数据库连接问题,可以采用数据库连接池技术。 数据库连接池的基本思想:就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要 建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重 新建立一个。

数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库 连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池 的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连 接数量时,这些请求将被加入到等待队列中。

在这里插入图片描述

在这里插入图片描述

1.3 数据库连接池技术的优点

  1. 资源重用 由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一 方面也增加了系统运行环境的平稳性。

  2. 更快的系统反应速度 数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均 已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销, 从而减少了系统的响应时间

  3. 新的资源分配手段 对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库 连接数的限制,避免某一应用独占所有的数据库资源

  4. 统一的连接管理,避免数据库连接泄漏 在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据 库连接操作中可能出现的资源泄露

2.Druid连接池简介

Druid是一种高性能的开源数据库连接池,它在Java应用程序中被广泛使用。Druid连接池提供了连接管理、连接池监控、SQL性能监控等功能,能够有效地管理数据库连接,并提供丰富的性能指标和监控报告。

Druid连接池的一些主要特点包括:

  1. 连接池管理:Druid可以帮助你管理数据库连接,包括连接的创建、销毁和重用。它提供了连接池配置选项,可以灵活地调整连接池的大小、最大等待时间、验证查询等参数。

  2. 监控数据统计:Druid连接池提供了丰富的监控指标,如连接数、活跃线程数、执行SQL次数、慢查询次数、错误次数等。通过这些统计数据,你可以实时了解连接池的使用情况和性能状况。

  3. SQL性能监控:Druid连接池还可以监控和统计每条SQL语句的执行时间、返回行数等信息。这对于诊断和优化数据库访问性能非常有帮助,可以发现潜在的性能问题并进行针对性的优化。

  4. 连接池过滤器:Druid连接池支持自定义过滤器,可以在连接获取和归还的过程中进行额外的逻辑处理。你可以编写自己的过滤器来实现日志记录、安全验证等功能。

  5. 整合第三方监控工具:Druid连接池可以与其他监控工具(如Spring Boot Actuator、Prometheus、Grafana)集成,以便更好地可视化和报告连接池的性能数据。

总的来说,Druid是一款功能强大且性能优秀的数据库连接池,适用于需要高效管理和监控数据库连接的Java应用程序。你可以通过配置和使用Druid连接池,提升数据库访问的性能和稳定性。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.整合

3.1 依赖

 <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>

3.2 配置

spring:
  application:
    name: liuyunshengsir
  main:
    allow-bean-definition-overriding: true
  datasource:
    name: liuyunshengsir
    url: jdbc:mysql://liuyunshengsir:3306/liuyunshengsir?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8&useSSL=false&createDatabaseIfNotExist=true
    username: root
    password: liuyunshengsir
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    druid:
      initial-size: 5
      min-idle: 5
      max-active: 25
      max-wait: 1000
      time-between-eviction-runs-millis: 60000
      validation-query: SELECT 1 as nums
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
      filters: stat # 拦截sql的开关
    initialization-mode: always

3.3前端页面访问配置

package com.sugon.cloud.config;

import com.alibaba.druid.support.http.StatViewServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

/**
 * @author liuysh
 * @since 2023/7/12 16:21
 */
@Configuration
public class DruidConfig {
    @Bean
    ServletRegistrationBean regisDruid() {
        //固定写法,配置访问路径
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        //配置登录信息,固定写法
        HashMap<String, String> initParams = new HashMap<>();
        //账号和密码的key是固定的
        initParams.put("loginUsername", "liuyunshengsir");
        initParams.put("loginPassword", "liuyunshengsir");

        //允许谁可以访问
        initParams.put("allow", "");
        bean.setInitParameters(initParams);
        return bean;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis-plus通用查询方法封装

定义DTO package com.lbdj.user.service.dto;import com.lbdj.toolkit.utils.ReturnField; import com.lbdj.toolkit.utils.SFunction; import lombok.Data;/*** 用户DTO** author 作者* since 2023-06-27*/ Data public class LbdjUserDTO {/*** 主键*/private Long id;priva…

Oracle表设计

设计原则 为了建立冗余较小、结构合理的数据库&#xff0c;设计数据库时必须遵循一定的规 则。在关系型数据库中这种规则就称为范式。 范式是符合某一种设计要求的总结。 要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的范式。在实际开发中最为 常见的设计范式…

Auto.js 填充布局 layout_weight=“1“

当我在编写界面布局时&#xff0c;遇到了一个需求&#xff1a; 顶部和底部有按钮&#xff0c;而中间部分需要填满剩余空间且高度未知。 我通过使用layout_weight"1"完美解决我的问题&#xff0c;在这里记录一下。 "ui"; ui.layout(<vertical><te…

STM32——关于GPIO口的输出方式和输入方式

在STM32中&#xff0c;我们会要使用程序来对I/O口进行控制&#xff0c;当我们使用I/O口时&#xff0c;我们就需要知道在程序中我们需要这个I/O口来实现什么功能&#xff0c;是输入还是输出。 1、使用输出模式 I/O口常用的输出方式有推挽输出和开漏输出。 &#xff08;1&#…

回归预测 | MATLAB实现WOA-CNN-GRU鲸鱼算法优化卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现WOA-CNN-GRU鲸鱼算法优化卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现WOA-CNN-GRU鲸鱼算法优化卷积门控循环单元多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实现WOA-CNN-GR…

驱动day5

驱动程序 #include <linux/init.h> #include <linux/module.h> #include<linux/fs.h> #include<linux/device.h> #include<linux/cdev.h> #include<linux/slab.h> #include<linux/uaccess.h> #include<linux/of.h> #include&…

11.4.2:DotImage SDK 基于web的扫描功能 cRACK

包含&#xff1a; DDotImage Document ImagingPDF Reader w/ Text ExtractionWingScan with eVRSOffice ReaderDotPDFBarcode Reading and WritingOCR Engines DotImage SDK WingScan 亮点&#xff0c;&#xff0c;WEB WingScan附带了一个简单的HTML5/JavaScript文档查看器…

Postgresql优化器如何使用列统计信息?

对pg_statistic表的查询都是走syscache的&#xff0c;要找到所有使用列统计信息地方&#xff0c;遍历系统表索引即可 enum SysCacheIdentifier {...STATEXTDATASTXOID,STATEXTNAMENSP,STATEXTOID,STATRELATTINH,... }下面是最常用的STATRELATTINH索引场景&#xff0c;即 Sear…

小奇猫物语之产品经理篇(2)

小奇猫物语之产品经理篇&#xff08;2&#xff09; 喵喵提示&#xff1a;小奇的产品经理篇&#xff08;2&#xff09;来咯&#xff0c;预告一下&#xff0c;前面几篇主要是讲产品经理的思维模式以及怎样去从一个学生思维转变成一个能带领一个项目的产品经理思维&#xff0c;所…

DolphinDB 与通联数据达成合作,构建快捷高效的一站式行情数据服务

在此前发布的多篇教程中&#xff0c;我们为大家展示了 DolphinDB 如何为因子投研、实时计算等业务场景加速&#xff0c;并进行了手把手教学&#xff0c;比如&#xff1a; 对接极速行情&#xff0c;真的很简单…… 又比如&#xff1a; 自己动手&#xff0c;搭一套行情回放系统…

Vue 路由跳转

文章目录 前言路由基础子路由路由传参query 传参 path静态传参动态传参 params 传参 name 编程式路由利用JS实现路由跳转 router 路由守卫 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; views里面放的是视图子组件&#xff08;首页、商家列表、商品列…

MySQL(九):MySQL语法-高级

MySQL语法-高级 LIMITLIKEASCREATE UNIQUE INDEX、DROP INDEXCREATE VIEW、DROP VIEWGROUP BYHAVINGMYSQL - JOININNER JOIN、JOINLEFT JOIN、LEFT OUTER JOINRIGHT JOIN、RIGHT OUTER JOINLEFT JOIN ... WHERE ...RIIGHT JOIN ... WHERE ... TRUNCATE TABLEINSERT INTO 表1 (列…

信创电子档案管理单机版系统之档案利用的功能介绍

专久智能信创电子档案管理单机版系统的档案利用&#xff0c;包括对电子档案的网上利用和对档案实体的借阅两种方式&#xff0c;用户对档案的利用都是通过 WEB 方式的档案网站实现的。 用户可以根据系统赋予的权限对电子档案目录进行检索查询&#xff0c;找到所需的档案目录&…

图像分类——图像增强方法

目录 常用的图像增强方法tf.image进行图像增强翻转和裁剪颜色变换 使用ImageDataGenerator(进行图像增强) 常用的图像增强方法 tf.image进行图像增强 离线实现 import tensorflow as tf import matplotlib.pyplot as plt import numpy as npcatplt.imread(./cat.jpg) plt.ims…

【后端面经-架构】RabbitMQ简介

【后端面经-架构】RabbitMQ简介 1. MQ介绍2. RabbitMQ2.1 简介2.2 架构&#xff1a;组件解释2.3 特点2.4 优缺点 面试模拟参考资料 1. MQ介绍 MQ&#xff08;Message Queue&#xff09;用于在应用程序之间相互通信&#xff0c;在消息中发送数据进行通信&#xff0c;而不需要特…

数据结构(王卓版)——算法分析

一个好算法如何衡量&#xff1a; 分析算法时间复杂度的方法&#xff1a; 复杂算法的计算规则&#xff1a; 空间复杂度

【深度学习】基于BRET的高级主题检测

一、说明 使用BERT&#xff0c;UMAP和HDBSCAN捕获文档主题&#xff0c;紧随最先进的BERTopic架构&#xff08;transformer编码器&#xff09;。 主题检测是一项 NLP 任务&#xff0c;旨在从文本文档语料库中提取全局“主题”。例如&#xff0c;如果正在查看书籍描述的数据集&am…

fatal: unable to access ‘http://xxxx‘: Empty reply from server

当你遇到 “fatal: unable to access ‘http://xxxx’: Empty reply from server” 的错误信息时&#xff0c;通常表示 Git 客户端无法连接到指定的服务器或仓库。 以下是一些可能导致该错误的原因以及一些排除故障的步骤&#xff1a; 错误的 URL&#xff1a;确保你提供的 URL…

linux 服务器之间传输文件的方式

情景&#xff1a;有时迁移项目&#xff0c;一般人就想到需要在服务器下载到win本地电脑上面&#xff0c;再上传到目的服务器&#xff0c;这样若是文件大&#xff0c;下载的速度都足够让你歇一天了。遇到这问题&#xff0c;怎么解决呢&#xff1f; 方法1&#xff1a;scp 【优点…

数据结构---手撕图解双向循环链表

文章目录 写在前面双向循环链表的构造布局带有哨兵位的布局 链表的构建链表的销毁链表的输出链表的尾插链表的尾删链表的头插链表的头删链表的查找链表的插入链表的删除 写在前面 在前面学完单链表后&#xff0c;我们思考这样一个问题&#xff0c;单链表和顺序表比起来&#x…