springboot整合canal
学习链接
Cannal项目地址
SpringBoot整合Canal实现数据同步到ElasticSearch - 原文地址
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
Java:SpringBoot整合Canal实现数据同步
docker环境安装mysql、canal、elasticsearch,基于binlog利用canal实现mysql的数据同步到elasticsearch中
canal Value too long for column “CHARACTER VARYING”
canal学习笔记
文章目录
- 学习链接
- SpringBoot整合Canal实现数据同步
- 一、前言
- 二、Canal简介
- 三、MySQL开启BinLog日志
- 3.1 检查MySQL是否有开启binlog日志
- 3.2开启binlog日志步骤
- 四、Canal的配置和启动
- 4.1 下载Canal
- 4.2 修改canal配置
- 4.3 启动Canal
- 五、搭建Canal-Admin可视化管理
- 5.1 下载Canal-admin
- 5.2 修改配置文件
- 5.3 启动并登录
- 5.4 配置canal-server和canal-admin
- 六、SpringBoot整合Canal
- 6.1 项目添加依赖
- 6.2 新建监听类
- 6.3 配置启动时开启监听
- 6.4 启动canal服务,并修改数据
- 七、 SpringBoot+RabbitMQ+Canal监听MySQL数据变化
- 7.1 搭建rabbitMq
- 7.2 配置RabbitMQ
- 7.3 修改canal配置
- 7.4 SpringBoot 整合 RabbitMQ
- 7.5 运行结果
SpringBoot整合Canal实现数据同步
一、前言
二、Canal简介
canal 译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费,canal可以用来监控数据库数据的变化,从而获得新增数据,或者修改的数据。canal原理就是伪装成mysql的从节点,从而订阅master节点的binlog日志
Canal原理:
- canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
- mysql master收到dump请求,开始推送binary log给slave(也就是canal)
- canal解析binary log对象(原始为byte流)
三、MySQL开启BinLog日志
注意: 由于不同环境,不同版本的MySQL可能存在差异,如果不能按下述方法开启binlog日志,那么就自行百度开启binlog步骤
3.1 检查MySQL是否有开启binlog日志
show variables like 'log_bin';
如果显示如下,则代表未开启binlog日志
3.2开启binlog日志步骤
#1.编辑MySQL配置文件(linux下的修改命令)
vim /etc/my.cnf
#2.添加配置
[mysqld]
log-bin=mysql-bin # 开启binlog
binlog-format=ROW # 选择ROW模式
server_id=1 # 配置MySQL replaction需要定义,不和Canal的slaveId重复即可
#3.重启MySQL,再次使用下述命令查看是否开启binlog
show variables like 'log_bin';
show binary logs;
show variables like 'binlog_format%'
windows环境下:
重启MySQL服务:
再次使用命令查看是否已经开启binlog日志,ON代表已经成功开启
**提示:**binlog文件的位置:如果在修改my.ini的binlog时给的是全路径,那么生成的日志文件就在指定的目录下;如果添加配置时只给一个名字,那么生成的binlog日志的位置为
四、Canal的配置和启动
4.1 下载Canal
Canal的下载:
- 官方文档:https://github.com/alibaba/canal/wiki
- 项目地址:https://github.com/alibaba/canal
- 下载地址:https://github.com/alibaba/canal/releases
进入下载地址,选择Canal下载,我这里下载的是windows版本,如果你是linux版本的可以选择不同的版本下载,也可以使用docker搭建
4.2 修改canal配置
# position info 你的MySQL的主机和端口
canal.instance.master.address=127.0.0.1:3306
# username/password 连接MySQL的用户名和密码
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
4.3 启动Canal
在canal.deployer-1.1.7-SNAPSHOT\bin目录下,双击startup.bat即可启动
查看是否启动成功:
看到上述截图,代表Canal的服务端已经搭建成功
五、搭建Canal-Admin可视化管理
5.1 下载Canal-admin
下载地址:https://github.com/alibaba/canal/releases
5.2 修改配置文件
5.3 启动并登录
通过双击bin目录下的startup.bat文件启动canal-admin,然后通过IP+8089端口访问
使用密码登录:默认用户 admin/123456
5.4 配置canal-server和canal-admin
具体不做描述,不是本篇重点,后续补充
六、SpringBoot整合Canal
注意: 项目pom文件中导入的canal版本需要和本地(或服务器)上启动的canal版本保持一致,否则会有代码中连接不上本地canal的情况,本案例采用的是canal 1.6版本
6.1 项目添加依赖
<!--canal--><dependency><groupId>com.alibaba.otter</groupId><artifactId>canal.client</artifactId><version>1.1.6</version></dependency><!--如果你用的是canal1.1.6版本以下的,可以不用映入下面的这项内容,用1.1.6不引入这个会导入不了Message类报错--> <dependency><groupId>com.alibaba.otter</groupId><artifactId>canal.protocol</artifactId><version>1.1.6</version></dependency>
6.2 新建监听类
新建监听类,用于监听Canal通道中的binlog日志信息,实时监听数据库的数据变化,代码如下:
package com.study.listener;import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.client.CanalConnectors;
import com.alibaba.otter.canal.protocol.CanalEntry;
import com.alibaba.otter.canal.protocol.Message;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.net.InetSocketAddress;
import java.util.List;/*** @BelongsProject: workdemo* @BelongsPackage: com.study.listener* @Author: jiaoqixue* @CreateTime: 2022-12-22 14:27* @Description: TODO* @Version: 1.0* 这种没有经过消息队列* 直接连接Canal* 每隔一条去检查Canal里有没有消息*/
@Slf4j
@Component
public class CanalClient {private final static int BATCH_SIZE = 1000;/*** @param* @Author: jqx* @Date: 2022/12/22 15:11* @Description: Canal入库方法*/public void run() {//建立连接CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("10.0.42.83", 11111), "example", "", "");try {//打开连接(注意pom文件中引入的canal版本一定要和本机启动的版本保持一致,否则可能会出现连接打开被拒绝的情况)connector.connect();//配置需要监听的数据表(订阅数据库表,全部表)connector.subscribe(".*..*");//回滚到未ack的地方,下次fetch的时候,可以从最后一个没有ack的地方拿connector.rollback();//while (true) {//获取指定数量的数据Message message = connector.getWithoutAck(BATCH_SIZE);//获取批量IDlong batchid = message.getId();//获取批量的数量int size = message.getEntries().size();//如果没有数据,线程睡眠一秒if (batchid == -1 || size == 0) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}} else {//如果有数据则处理数据dataHandle(message.getEntries());}//进行 batch id 的确认。确认之后,小于等于此 batchId 的 Message 都会被确认。connector.ack(batchid);}} catch (Exception e) {e.printStackTrace();} finally {connector.disconnect();}}/*** @param entrys* @Author: jqx* @Date: 2022/12/22 16:40* @Description: 数据处理方法*/private void dataHandle(List<CanalEntry.Entry> entrys) throws Exception {for (CanalEntry.Entry entry : entrys) {if (entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONBEGIN || entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONEND) {//开启或者关闭事务的实体类型,跳过continue;}//RowChange对象,包含了一行数据变化的所有特征CanalEntry.RowChange rowChange = CanalEntry.RowChange.parseFrom(entry.getStoreValue());//获取操作类型:insert/update/delete类型CanalEntry.EventType eventType = rowChange.getEventType();//判断是否为 DDL语句if (rowChange.getIsDdl()) {log.info("是DDL语句{}", rowChange.getSql());}// 根据不同的语句类型,处理不同的业务if (eventType == CanalEntry.EventType.INSERT) {//是新增语句,业务处理。如果新增的时候数据没有发生变化的情况下,是不会被执行log.info("新增数据:库名:{},--表名:{}", entry.getHeader().getSchemaName(), entry.getHeader().getTableName());} else if (eventType == CanalEntry.EventType.UPDATE) {//是修改语句,业务处理。如果修改的时候是没有修改任何数据的情况下,是不会被执行log.info("修改数据:库名:{},--表名:{}", entry.getHeader().getSchemaName(), entry.getHeader().getTableName());} else if (eventType == CanalEntry.EventType.DELETE) {//是删除语句,业务处理。如果删除的时候是没有数据的情况下,是不会被执行log.info("删除数据:库名:{},--表名:{}", entry.getHeader().getSchemaName(), entry.getHeader().getTableName());}}}
}
6.3 配置启动时开启监听
-
方式一
在启动类上集成CommandLineRunner接口,并重写run方法,Spring boot的CommandLineRunner接口主要用于实现在项目启动后,去执行一段代码块逻辑,这段初始化代码在整个应用生命周期内只会执行一次,当项目中有多个类实现CommandLineRunner接口时,可以通过注解@Order控制实现类执行顺序,其中Order的值越小越先被执行。
package com.study;import com.study.listener.CanalClient; import org.springframework.amqp.rabbit.annotation.EnableRabbit; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling;import javax.annotation.Resource;@SpringBootApplication @EnableScheduling @EnableDiscoveryClient @EnableAsync @EnableRabbit public class WorkdemoApplication implements CommandLineRunner {@Resourceprivate CanalClient canalClient;public static void main(String[] args) {SpringApplication.run(WorkdemoApplication.class, args);}@Overridepublic void run(String... args) throws Exception {//项目启动,执行canal客户端监听,原因实现了CommandLineRunner接口,可在项目启动后执行此段代码canalClient.run();} }
-
方式二
在监听类上实现ApplicationRunner接口,springBoot项目启动时,若想在启动之后直接执行某一段代码,就可以用 ApplicationRunner这个接口,并实现接口里面的run(ApplicationArguments args)方法,方法中写上自己的想要的代码逻辑
@Component //此类一定要交给spring管理 public class ConsumerRunner implements ApplicationRunner{@Overridepublic void run(ApplicationArgumers args) throws Exception{//代码System.out.println("需要在springBoot项目启动时执行的代码---");} }
6.4 启动canal服务,并修改数据
七、 SpringBoot+RabbitMQ+Canal监听MySQL数据变化
7.1 搭建rabbitMq
RabbitMQ的搭建非本文重点,所以这里不做详细描述,如不能按照以下方式搭建成功,可以自己百度搭建rabbitMq,我这里使用的是docker搭建的
#1.获取镜像
docker pull rabbitmq
#2.创建并启动容器
docker run -d -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --hostname myRabbit --name rabbitmq rabbitmq
#3.启动rabbitmq_management(RabbitMQ的管理界面)
docker exec -it rabbitmq rabbitmq-plugins enable rabbitmq_management
#4.开放服务器的15672端口和5672端口
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --zone=public --add-port=5672/tcp --permanent
#5.重启防火墙生效
firewall-cmd --reload
#6.检查阿里云安全组是否放行对应的端口,如果没有放行也是无法访问的,记得去阿里云控制台去放行对应的端口
#7.访问http://ip:15672
#用户名:admin
#密码:admin
7.2 配置RabbitMQ
-
创建交换机
-
创建队列
-
绑定交换机和队列
7.3 修改canal配置
-
修改canal.properties文件:
# tcp, kafka, rocketMQ, rabbitMQ, pulsarMQ canal.serverMode = rabbitMQ################################################## ######### RabbitMQ ############# ################################################## rabbitmq.host =IP #如果你没有在启动容器的时候使用RABBITMQ_DEFAULT_VHOST=my_vhost指定,那你就写 / 即可 rabbitmq.virtual.host =my_vhost rabbitmq.exchange =canal.exchange rabbitmq.username =admin rabbitmq.password =admin rabbitmq.deliveryMode =
-
修改 instance.properties 文件:
#数据库连接信息 # position info canal.instance.master.address=127.0.0.1:3306# username/password canal.instance.dbUsername=root canal.instance.dbPassword=123456# mq config canal.mq.topic=canal.routing.key
-
修改完上述两个位置后,重启canal
7.4 SpringBoot 整合 RabbitMQ
-
引入maven依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency>
-
添加配置信息
#RabbitMQ配置 spring.rabbitmq.host=106.122.133.533 spring.rabbitmq.port=5672 spring.rabbitmq.username=admin spring.rabbitmq.password=admin spring.rabbitmq.virtual-host=my_vhost
-
新建RabbitMQ 监听器
package com.study.listener;import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;/*** Canal + RabbitMQ 监听数据库数据变化*/
@Slf4j
@Component
public class CanalListener {@RabbitListener(bindings = {@QueueBinding(value = @Queue(value = "canal.queue", durable = "true"),exchange = @Exchange(value = "canal.exchange"),key = "canal.routing.key")})public void handleDataChange(String message) { // 这里要改成byte[]去接收JSONObject object = JSONObject.parseObject(message);log.info("Canal监听到数据发生变化\n库名:{}\n表名:{}\n类型:{}\n数据:{}", object.getString("database"), object.getString("table"), object.getString("type"), object.getString("data"));}
}
7.5 运行结果
启动项目,并修改一条数据库记录
相关文章:
springboot整合canal
学习链接 Cannal项目地址 SpringBoot整合Canal实现数据同步到ElasticSearch - 原文地址 Spring Boot整合canal实现数据一致性解决方案解析-部署实战 Java:SpringBoot整合Canal实现数据同步 docker环境安装mysql、canal、elasticsearch,基于binlog利…...
8.在 Vue 3 中使用 OpenLayers 加载天地图示例(多种形式)
前言 OpenLayers 是一个强大的开源地图框架,可以轻松实现地图加载与操作。而 Vue 3 则通过 Composition API 提供了更加简洁和灵活的开发体验。本文将介绍如何在 Vue 3 中结合 OpenLayers 实现对天地图的加载,包括矢量地图、卫星地图以及中文和英文标记等…...
如何设置 Java 开发环境
如果你在这里,可能是想学习如何为 Java 开发设置环境。第一步是安装 SDK(软件开发工具包),它是一组由硬件和软件供应商提供的工具和库。 对于 Java,我们使用 JDK(Java 开发工具包)。JDK 是一组…...
MetaGPT 安装
1. 创建环境 conda create -n metagpt python3.10 && conda activate metagpt2. 可编辑方式安装 git clone --depth 1 https://github.com/geekan/MetaGPT.git cd MetaGPT pip install -e .3. 配置 metagpt --init-config运行命令,在C盘位置C:\Users\325…...
石岩湿地公园的停车场收费情况
周末石岩湿地公园停车场【967个】小车停车费封顶14元价格还行,我还记得2020年的时候湿地公园还是10元一天封顶。现在的收费情况也是可以的,尤其是周末停车比工作日停车便宜还是很得民心的哈。 车型 收费标准 小车 工作日 高峰时间8:00~20:00 首小时…...
v3账号密码登录随机图片验证码
安装插件 pnpm i identify --save图形验证码组件 <template><div class"s-canvas"><!-- 图形验证码的宽和高都来自于父组件的传值,若父组件没有传值,那么就按当前子组件的默认值进行渲染 --><canvas id"s-canvas&…...
mysql8 主从复制一直失败
问题描述: 开启同步后从服务器一直失败,报错如下: Last_SQL_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction ANONYMOUS at source log …...
Java项目实战II基于微信小程序的消防隐患在线举报系统(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化进程的加快&…...
【第二十四周】从大语言模型到多模态大模型的发展
摘要 大语言模型(Large Language Model, LLM)是指一类基于深度学习的人工智能系统,它们被设计用来理解和生成自然语言。这些模型通常是在大量的文本数据上进行训练的,通过学习文本中的模式和结构,它们能够执行各种各样…...
深入理解Java的 JIT(即时编译器)
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
数据库技术文档撰写:全方位剖析
在技术的浩瀚海洋中,一份优秀的技术文档宛如精准的航海图。它是知识传承的载体,是团队协作的桥梁,更是产品成功的幕后英雄。然而,打造这样一份出色的技术文档并非易事。你是否在为如何清晰阐释复杂技术而苦恼?是否纠结…...
设计模式之原型模式:深入浅出讲解对象克隆
~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” 原型模式概述 在我们的日常生活中,经常会遇到"复制"这样的场景。比如我们在准备文件时,常常会复印一份原件&a…...
centos 查看版本
在 CentOS 中,查看系统版本有多种方法。以下是几种常用的方法: 方法 1:使用 cat 命令查看 /etc/centos-release 文件 cat /etc/centos-release 这个文件包含了 CentOS 的版本信息。例如,输出可能是: CentOS Linux rel…...
如何本地存储中的文件路径
文章目录 1. 概念介绍2. 实现方法3. 示例代码我们在上一章回中介绍了"如何实现本地存储"相关的内容,本章回中将介绍如何实现文件存储.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值,如果遇到…...
服务器加固
1.服务器密码复杂度 密码最小长度,密码复杂度策略 vim /etc/pam.d/system-auth --------------- #密码配置 #ucredit:大写字母个数;lcredit:小写字母个数;dcredit:数字个数;ocredit:…...
MongoDB change stream实战
什么是 Chang Stream Change Stream指数据的变化事件流,MongoDB从3.6版本开始提供订阅数据变更的功能。 Change Stream 是 MongoDB 用于实现变更追踪的解决方案,类似于关系数据库的触发器,但原理不完全相同: Change Stream 的实…...
TSWIKI知识库软件
TSWIKI 知识库软件介绍 推荐一个适合本地化部署、自托管的知识库软件 TSWIKI介绍 tswiki 是一个适合小团队、个人的知识库、资料管理的软件,所有数据均本地化存储。可以本地化、私有云部署,安装简单。在线预览。 主要功能说明 1、简化的软件依赖和安…...
【Linux课程学习】第十九弹---深入理解进程间通信---匿名管道,命名管道,多匿名管道的BUG
🎁个人主页:我们的五年 🔍系列专栏:Linux课程学习 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux学习笔记: https://blog.csdn.n…...
【C语言】库函数常见的陷阱与缺陷(1):字符串处理函数
目录 一、 strcpy 函数 1.1. 功能与常见用法 1.2. 陷阱与缺陷 1.3. 安全替代 1.4. 代码示例 二、strcat 函数 2.1. 功能与常见用法 2.2. 陷阱与缺陷 2.3. 安全替代 2.4. 代码示例 三、strcmp 函数 3.1. 功能与常见用法 3.2. 陷阱与缺陷 3.3. 安全替代 3.4. 代…...
Qt中的 tableView 设置 二进制 十六进制 序号表头
二 进制序号 因为QTableView的垂直表头并不支持使用委托来自定义。 相反,可以通过将自定义的QWidget作为QHeaderView的标签来实现这一目标。 代码: #include <QApplication> #include <QMainWindow> #include <QVBoxLayout> #include …...
leetCode121.买卖股票的最佳时机
题目: 给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。 你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你…...
基于单片机的自限位电机正反转控制电路
【摘要】 针对减速直流电机正反转和停转控制问题,设计了正反转及自限位控制电路,编制了基于STM8S103单片机的控制电机正反转及自限位的子程序,并应用IAR软件进行仿真,搭建实验装置验证设计效果,实验结果表明所设计控制电路能够良好地控制电机正转、反转和停转,在生活实际…...
为什么使用 Token 而不是 Cookie 来管理用户认证和会话
使用 Token 而不是 Cookie 来管理用户认证和会话的原因主要有以下几点: 跨域问题 (Cross-Domain) Token:通常是存储在客户端的 localStorage 或 sessionStorage 中,不会自动随请求发送到服务器,这使得它在处理跨域请求时更加灵活…...
WIDER FACE数据集转YOLO格式
1. 引出问题 本人最近在做毕设相关内容,第一阶段目标是通过目标检测来统计课堂人数,因此需要对人脸和人头进行目标检测。模型方面没什么好说的无脑用YOLO,数据集方面,人脸部分找到了来自港中文的WIDER FACE数据集。但是解压后发现…...
机器学习概述详解
文章目录 机器学习概述详解一、引言二、机器学习基础1、机器学习定义及应用场景2、监督学习与无监督学习 三、机器学习开发流程四、使用示例1、LeNet网络结构代码示例2、AlexNet网络结构代码示例 五、总结 机器学习概述详解 一、引言 机器学习作为人工智能的一个重要分支&…...
VTK编程指南<三>:基于VTK入门程序解析来理解VTK基础知识
1、VTK入门程序 下面是一个完整的Vtk入门程序,我们基于这个程序来对VTK的基本知识进行一个初步了解。 #include <iostream>#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2);// VTK was built with vtkRenderingOpenGL2 VTK_MODULE_INI…...
【UE5 C++课程系列笔记】07——使用定时器实现倒计时效果
使用定时器实现如下倒计时效果 效果 步骤 1. 新建一个Actor类,这里命名为“CountDownTimerActor” 2. 在头文件中先定义倒计时时间和更新剩余时间的函数方法 前向声明一个文本渲染组件 3. 在源文件中引入文本渲染组件 创建文本渲染组件并进行一些设置 实现Update…...
基于DDPM的PyTorch简单实现
基于DDPM的PyTorch简单实现 文章目录 基于DDPM的PyTorch简单实现摘要Abstract一、DDPM实现1. 获取数据集2. DDPM类3. 训练算法4. 去噪神经网络5. 实验结果与采样 总结 摘要 本周的学习与实践围绕扩散模型(Diffusion Model)的基础理论和实现展开…...
php laravel 学习管理系统(LMS)
Lernen LMS(学习管理系统)是一个综合性的在线教育平台,旨在为学生和导师提供灵活、高效、便捷的学习体验。该系统不仅帮助学生找到最适合自己的导师,还通过一系列强大的功能,提升了课程安排、学习管理和师生互动的效率…...
【JAVA】Java高级:数据库监控与调优:SQL调优与执行计划的分析
作为Java开发工程师,理解SQL调优和执行计划的分析是至关重要的。这不仅可以帮助我们提高数据库查询的效率,还能减少系统资源的消耗,提升整体应用的性能。 1. SQL调优的重要性 随着数据量的增加和用户请求的增多,数据库的性能问题…...
centos9升级OpenSSH
需求 Centos9系统升级OpenSSH和OpenSSL OpenSSH升级为openssh-9.8p1 OpenSSL默认为OpenSSL-3.2.2(根据需求进行升级) 将源码包编译为rpm包 查看OpenSSH和OpenSSL版本 ssh -V下载源码包并上传到服务器 openssh最新版本下载地址 wget https://cdn.openb…...
jeccg-boot修改密码
最近在使用jeccg-boot框架,遇到一个需要批量修改用户密码的问题 由于框架使用的是加密盐算法生成的密码 ,无法直接通过数据库修改密码 例如将password字段和salt值复制过去,密码是不对的 查看代码发现通过user.getUsername(), user.getPasswo…...
linux 生成 nginx 的https ssl 证书详解
证书生成 1. 生成证书 会提示输入密码,输入两次相同密码即可。 openssl genrsa -des3 -out server.key 20482. 去除密码校验 如果想去除此输密码的步骤,可以执行如下命令,根据使用需求选择。 openssl rsa -in server.key -out server.ke…...
详细介绍vue的递归组件(重要)
递归组件在 Vue 中是一个非常强大的概念,尤其在渲染层级结构(如树形结构、嵌套列表、评论系统等)时,能够极大地简化代码。 什么是递归组件? 递归组件就是一个组件在其模板中引用自身。这种做法通常用于渲染树形结构或…...
gitlab配置调试minio
官方文档 rails console 调试 查看配置Settings.uploads.object_store加载minio clientrequire fog/awsfog_connection Fog::Storage.new(provider: AWS,aws_access_key_id: 你的MINIO_ACCESS_KEY,aws_secret_access_key: 你的MINIO_SECRET_KEY,region: <S3 region>,e…...
Docker(Nginx) 部署 uniapp
目录 一、准备工作 1.Docker安装nginx 2.安装HBuild X工具 二、HBuild X打包项目 1.在HBuild X导入项目 2.配置manifest.json 3.打包 (1)点击发行 (2)填写信息,点击发行 三、nginx部署uniapp 1.生成文件上传…...
Camp4-L2:LMDeploy 量化部署进阶实践
书生浦语大模型实战营第四期:LMDeploy 量化部署进阶实践 教程链接:https://github.com/InternLM/Tutorial/tree/camp4/docs/L2/LMDeploy视频链接:https://www.bilibili.com/video/BV18aUHY3EEG/?vd_sourceb96c7e6e6d1a48e73edafa36a36f1697…...
第二十四周学习周报
目录 摘要Abstract1. 文献阅读1.1 RNN1.2 Deep Recurrent Neural Networks1.3 实验1.4 讨论 2. AI虚拟主播生成总结 摘要 本周的主要任务是阅读了一篇关于循环神经网络的论文,该论文旨在探索将RNN扩展到深度RNN的不同方法。论文通过对RNN结构的理解和分析ÿ…...
深入解析 Android PMS —— APK 安装与解析全流程
文章目录 前言1. PMS 的初始化1.1 SystemServer 启动 PMS1.2 PMS 的入口方法 main1.3 PMS 构造函数1.4 扫描 APK 文件1.5 权限初始化1.6 提供对外服务 2. APK 安装机制2.1. 安装请求的触发2.2 APK 文件解析与验证2.3 签名校验2.4 权限管理2.4.1 权限声明2.4.2 权限校验与分配 2…...
RL仿真库pybullet
1. 介绍 PyBullet是一个基于Bullet Physics引擎的物理仿真Python接口,主要用于机器人仿真模拟。 1.1 主要特点 提供大量预设的机器人模型,例如URDF(统一机器人描述格式)、SDF、MJCF 格式。适用于训练和评估强化学习算法,提供了大量的强化学…...
Vue3组件通信(父传子,子传父,跨组件通信)
本文主要是讲述Vue3在setup语法糖下的组件间通信 Vue组件通信是指在Vue.js中,不同组件之间进行信息交流和共享数据的过程。在前端开发中,组件通信是非常重要的一部分,因为在一个复杂的应用中,不同的组件通常需要相互协作ÿ…...
从失败中学习:如何将错误转化为学习机会
失败是人生的一部分,无论是在个人生活还是职业生涯中,我们都难免会遇到挫折和错误。然而,失败并不意味着终结,而是一个潜在的学习机会。通过正确的态度和方法,我们可以从失败中汲取经验,转化为成长的动力。…...
[0629].第29节:配置中心业务规则与动态刷新
我的后端学习大纲 SpringCloud学习大纲 1、编码实现3377服务: 1.1.建module: 1.2.改pom: 1.3.写YML: 1.Nacos同Consul一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正…...
JUC并发编程
进程:系统中正在运行的一个应用程序,程序一旦运行就是进程,是资源分配的最小单元。 线程:系统分配处理器时间资源的基本单元,进程之内独立执行的一个单元执行流,是程序执行的最小单位。 Lock 需要手动上…...
贪心算法解题方法介绍+实操案例——会场安排与月饼售卖问题解析
从贪心算法到实操案例——会场安排与月饼售卖问题解析 前言 贪心算法是一种通过选择局部最优解来尝试构建全局最优解的算法。它简单高效,适用于许多优化问题。本文将详细介绍贪心算法的一般解题步骤,并通过两个实例——月饼售卖问题和会场安排问题——…...
ASP.NET Core API 前后端分离跨域
环境准备 数据库: sqlserver 2022 后端: vs2022 ASP.NET Core API .net 8 前端: Hbuilderx bootstrap 5.3.0 jquery v3.7.1 bootstrap-table 1.23.5 完整项目代码下载地址 功能 实现 单张表 的 增 删 改 查 创建数据库和表 create data…...
用Python绘制医学热图
在医学研究和临床实践中,数据的可视化是不可或缺的一部分。通过直观的数据展示,医学专业人员可以更好地理解各种疾病的治愈率、治疗效果以及医院之间的差异。今天,我们将介绍一种强大的数据可视化工具——热图(Heatmap)…...
使用 Spring Boot 和 GraalVM 的原生镜像
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:历代文学,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计…...
Flutter解压文件并解析数据
Flutter解压文件并解析数据 前言 在 Flutter 开发中,我们经常需要处理文件的读取和解压。 这在处理应用数据更新、安装包、存档文件等场景中尤为常见。 本文将介绍如何在Flutter中使用archive插件来解压文件并解析数据。 准备 在开始之前,我们需要…...
深入理解 JavaScript 引擎与消息队列的底层原理
深入理解 JavaScript 引擎与消息队列的底层原理 JavaScript 是现代 Web 开发中最为重要的编程语言之一,它的运行和执行方式常常是开发者关注的重点。为了更好地理解 JavaScript 的执行过程,我们需要深入探索 JavaScript 引擎的工作原理,尤其…...