Springboot中集成mongodb,mysql(密码从密码服务中获取并且动态更新)

news2025/7/13 0:40:25

一.密码服务:公司统一进行数据库密码管理,为了防止密码泄露,会不定时更换密码,服务端就需要获取密码,类似key,value账号类型,首先根据数据库名去密码服务注册一个账号,后面通过这个注册的这个账号去获取密码。

有两种方式去实现:

1.定时任务

开启定时任务去监控数据库密码是否更改或者去检查数据源是否有报错信息:

(1)监控数据库密码是否更改:密码服务使用hashMap缓存密码到本地,所以通过获取上次缓存的密码接口和最新的密码接口,通过比较这来两个密码是否相等,不等则调用DruidDataSource中的restart()方法重置数据库连接池;

(2)检查数据源是否有报错信息:获取DruidDataSource中的getLastCreateError()和getLastCreateErrorTime()方法,判断数据源是否发生错误,然后判断是否是10s以内的错误,判断之后再重新获取密码,restart()方法重置数据库连接池

2.自定义sql异常处理类

在异常类中判断如果错误码是1045这个错误代码的意思为登录账号的密码错误或者是没有权限,则重新调用密码服务获取密码,然后restart()方法重置数据库连接池;

(1)全局捕获sqlException,

(2)自定义注解和aop切面的方式进行判断:

@Target     -注解用于dao层的包即ElementType.PACKAGE: 用于描述包

@AfterThrowing:异常抛出增强,相当于ThrowsAdvice

@After: 最终通知(在目标方法执行后调用,无论目标方法是否出现异常,都会执行),不管是抛出异常或者正常退出都会执行

使用@AfterThrowing或者@After,在其方法中如果有SqlException则调用sql异常处理类去处理

注意:

1.因为restart()不会重新获取设置密码,还需要调用setPassword();

2.已经创建的连接还可以使用,直到连接用完或者失效,连接数以及失效时间都是可以进行配置的。

二.mysql多数据源

application.yml中简单配置:

spring:

    datasource:

           数据库1:

               type: com.alibaba.druid.pool.DruidDataSource

               driver-class-name: com.mysql.cj.jdbc.Driver

               url: 

               username:

              DBSourceKey: 获取密码服务的key

         数据库2:

               type: com.alibaba.druid.pool.DruidDataSource

               driver-class-name: com.mysql.cj.jdbc.Driver

               url: 

               username:

              DBSourceKey: 获取密码服务的key

其他配置:


#数据库连接配置
#驱动
spring.datasource.driverClassName = com.mysql.jdbc.Driver
#数据库链接
spring.datasource.url = jdbc:mysql://localhost:3306/testdb
#用户名
spring.datasource.username = root
#密码
spring.datasource.password = 123456

#数据库连接池配置
#初始化链接数
spring.datasource.initialSize=5  
#最小的空闲连接数
spring.datasource.minIdle=5
#最大的空闲连接数
spring.datasource.maxIdle=20
#最大活动连接数
spring.datasource.maxActive=20
#从池中取连接的最大等待时间,单位ms.  
spring.datasource.maxWait=60000
#每XXms运行一次空闲连接回收器
spring.datasource.timeBetweenEvictionRunsMillis=60000  
#池中的连接空闲XX毫秒后被回收 
spring.datasource.minEvictableIdleTimeMillis=300000  
#验证使用的SQL语句  
spring.datasource.validationQuery=SELECT 1 FROM DUAL  
#指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.    
spring.datasource.testWhileIdle=true  
#借出连接时不要测试,否则很影响性能  
spring.datasource.testOnBorrow=false  
#归还连接时执行validationQuery检测连接是否有效,
做了这个配置会降低性能
spring.datasource.testOnReturn=false  
#是否缓存preparedStatement,也就是PSCache。
PSCache对支持游标的数据库性能提升巨大,比如说oracle。
在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。
5.5及以上版本有PSCache,建议开启。
spring.datasource.poolPreparedStatements=true  
#属性类型是字符串,通过别名的方式配置扩展插件,
常用的插件有:
监控统计用的filter:stat 
日志用的filter:log4j
 防御sql注入的filter:wall
spring.datasource.filters=stat,wall,log4j  
#数据池连接参数
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  

多数据源实现,如下图:

 

密码服务(定时任务判断数据源错误信息):

 

 

三.mongodb多数据源

data:

   mongodb:

    primary:

        dbSource: 

        dbName:

        dbAddress:

        dbUsername:

  实现,如下图:

 

 基础数据库操作:

 

问题:Exception in monitor thread while connecting to server localhost:27017

原因:因为springboot会自动配置加载本地默认的配置,所以需要排除掉本地自动配置的;

解决:

1.@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})

2.移除之后会报No qualifying bean of type 'com.mongodb.MongoClient'等错误,然后按照上图配置缺什么注入什么,就OK。

四.拓展- spring动态刷新配置

1.使用spring 动态修改数据源需要继承AbstractRoutingDataSource类,实现determineCurrentLookupKey方法就能动态的修改数据源
2.不重启项目动态刷新配置我们需要spring-boot-starter-actuator提供刷新接口,spring-cloud-starter-config提供动态监测注解,具体实现流程可以参考链接:https://www.jianshu.com/p/230af40377cf

Springboot + DruidDataSource 实现不重启项目加载修改后的数据源_IISON的博客-CSDN博客

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

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

相关文章

【python】-详解进程与线程

文章目录进程1、多任务2、进程介绍3、多进程1 进程的创建步骤2 通过进程类创建进程对象3 进程的创建与启动代码4、进程执行带有参数的任务1 进程执行带有参数的任务2 args 参数的使用3 kwargs 参数的使用4 代码实现5 获取进程编号1 os.getpid()的使用2 os.getppid()的使用3 代码…

PLC中ST编程的定时器

定义通电延时功能块TON的变量,掉电延时功能块TOF的变量; 通过实例名来使用定时器; IN: 和 PT: 是输入引脚,Q> 和 ET> 是输出引脚; 定时器的通过IN输入引脚来触发的;定时器尽量不要在IF内调用&#…

ceph集群的搭建

ceph集群部署(准备阶段) 1. 配置静态网络(自选) 配置静态IP 2. 配置主机名(必做) ceph01: hostnamectl set-hostname ceph01ceph02: hostnamectl set-hostname ceph02ceph03&a…

[C++]打开新世界的大门之C++入门

🥁作者:华丞臧 📕​​​​专栏:【C】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉LeetCode 目录 一、C关键字…

iOS适配Unity-2019

iOS适配Unity-2019 背景 由于2019起,Unity的Xcode工程,更改了项目结构。 Unity 2018的结构: 可以看Targets只有一个Unity-iPhone,Unity-iPhone直接依赖管理三方库。 Unity2019以后: Targets多了一个UnityFramework…

什么是地理信息系统(GIS)?

什么是地理信息系统(GIS)? 什么是地理信息系统(GIS)?GIS是一个收集、显示、管理和分析地理信息的系统。让我们进一步探讨地理信息系统的所有方面。 地理信息系统(GIS)将地理与数据连…

读《大话数据结构》溢彩加强版

源代码: C:\迅雷下载\2021072816023491335\59e95a4689eeb92f380f4ab2\202107\29976aaa-ef7a-11eb-aba5-00163e0a088c PPT: C:\迅雷下载\2021072816023491335\59e95a4689eeb92f380f4ab2\202009\942a5ce8-fe34-11ea-a6a1-00163e0396a1 参考文献: C:\迅雷下…

SpringBoot整合JSR-303表单校验

JSR-303表单校验 思考一个问题,引出JSR-303 为什么前端做了参数校验,后端还要进行参数校验? 普通用户通过页面操作,前端可以校验住参数的正确性。但如果有人获取到接口,利用接口调用工具比如:postman对后…

Python 基础测试题(含答案)

一、 选择题:每小题 2 分,共 40 分。 1、 下列标识符命名中, 符合规范的是( )。 A、 1_a B、 for C、 年龄 D、 a#b 2、 下列标识符中,不是 Python 支持的数据类型的是 ( )。 A、…

深度学习之Python,OpenCV中的卷积

这篇博客将介绍图像内核和卷积。如果将图像视为一个大矩阵,那么图像内核只是一个位于图像顶部的微小矩阵。从左到右和从上到下滑动内核,计算输入图像和内核之间的元素乘法总和——称这个值为内核输出。内核输出存储在与输入图像相同 (x&#…

数据结构(高阶)—— 红黑树

目录 一、红黑树的概念 二、红黑树的性质 三、红黑树的结点定义 四、红黑树的插入 五、红黑树的验证 六、红黑树与AVL树的比较 一、红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加了一个存储位表示结点的颜色,可以使Red或Bl…

升级打怪拿offer,10w+字总结的Java面试题(附答案)够你刷

升级打怪拿offer,献上熬夜整理最新“10w字总结的Java面试题(附答案)”够你刷! 其包含的内容模块有:基础、JVM、多线程与高并发、Spring、MyBatis、SpringBoot、MYSQL、SpringCloud、Dubbo、Nginx、MQ、数据结构与算法…

CF104064 E. Exchange Students(NWERC2021)

题目分析 首先需要观察到一个性质:在最优方案下的操作一定是首先交换距离最近能交换的两个点来达到交换的效果,这个很好理解:题目要求如果要交换两个人的位置,中间的人的身高必须严格小于这两个人,因此合法的交换操作仅…

生成对抗网络(GAN)

GAN简介 GAN思想是一种二人的零和博弈思想,GAN中有两个博弈者,一个生成器(G),一个判别器(D),这两个模型都有各自的输入和输出。具体功能如下: 生成器(G&…

声门脉冲语音处理

对于 0<t<tpeak&#xff0c;gattack(t) 攻击部分&#xff0c;即上升分支的时间&#xff0c;时间 t 的范围从 0 秒到最大峰值时间 tpeak &#xff0c;图示例中选择为大约总长度的 35%&#xff0c;即 tpeak35%⋅T0&#xff0c;或者在样本 Lattack⌊35%⋅Lg⌉ 中&#xff0c…

2023年系统规划与设计管理师-第三章信息技术服务知识

一. 思维导图 二.IT 服务管理 (ITSM) 1. 什么是 IT 服务管理 (ITSM)&#xff1f; IT 服务管理 (ITSM) 包含一组策略和实践&#xff0c;这些策略和实践可用于为最终用户实施、交付和管理 IT 服务&#xff0c;以满足最终用户的既定需求和企业的既定目标。 在此定义中&#xff0…

otn 709帧结构

otn架构说明: 基于G.709接口,包括波分侧和客户侧,客户侧通常用于互联互通。 光通路净荷单元:OPU0/OPU1/OPU2/OPU3/OPU4/flex,主要用于完成业务同步或异步映射; 光通路数据单元:ODU0/ODU1/ODU2/ODU3/ODU4/ODU-flex,完成通道连接性能监测和子速率复用、 光通路传送单元…

POJ1008:玛雅日历

一、Description During his last sabbatical, professor M. A. Ya made a surprising discovery about the old Maya calendar. From an old knotted message, professor discovered that the Maya civilization used a 365 day long year, called Haab, which had 19 months.…

Netty学习笔记

文章目录二、Netty 入门2.1、概述2.1.1、Netty 是什么&#xff1f;2.1.2、Netty 的作者2.1.3、Netty 的地位2.1.4、Netty 的优势2.2、Hello World2.2.1、目标2.2.2、服务器端2.2.3、客户端2.2.4、流程梳理&#x1f4a1; 提示2.3、组件2.3.1、EventLoop&#x1f4a1; 优雅关闭演…

保姆级二进制安装高可用k8s集群文档(1.23.8)

保姆级二进制安装高可用k8s集群文档k8s搭建方式前期准备集群规划机器准备1、master vagrantfile2、master install.sh3、node vagrantfile4、node install.sh5、时间同步vagran 启动脚本vagrant up注意点安装conntrack 工具ipvs的安装VBoxManage snapshot 准备虚拟机快照ETCD部…