Maxwell简介、部署、原理和使用介绍

news2025/2/26 0:36:55

Maxwell简介、部署、原理和使用介绍

1.Maxwell概述简介

1-1.Maxwell简介

​ Maxwell是由美国Zendesk公司开源,使用Java编写的MySQL变更数据抓取软件。他会实时监控Mysql数据库的数据变更操作(包括insert、update、delete),并将变更数据以JSON的格式发送给Kafka、Kinesis、RabbitMQ、Redis、Google CloudPub/Sub、文件或其它平台等等流数据处理平台

Maxwell项目官方网站:https://maxwells-daemon.io/
Maxwell项目Github官网:https://github.com/zendesk/maxwell

1-2.Maxwell输出数据格式转化介绍

mysql> update test set name = 'wang111' where id=1;
Query OK, 1 row affected (0.01 sec)

原始SQL转化为json

{
	"database": "wangtingdb",
	"table": "test",
	"type": "update",
	"ts": 1676444034,
	"xid": 2569,
	"commit": true,
	"data": {
		"id": 1,
		"name": "wang111"
	},
	"old": {
		"name": "wang"
	}
}

字段说明:

  • database # 变更数据所属的数据库

  • table # 变更数据所属的表

  • type # 数据变更类型( insert,update,delete )

  • ts # 数据变更发生的时间戳( 1676443644 -> 2023-02-15 14:47:24 )

  • xid # 事务id

  • commit # 事务提交标志,可用于重新组装事务

  • data

    • 对于insert类型,data表示插入的数据
    • 对于update类型,data表示修改之后的数据
    • 对于delete的类型,data表示删除的数据
  • old # 对于update的类型,表示修改前的数据,仅包含变更字段

1-3.Maxwell使用场景

​ Maxwell 的常见应用场景有数仓ETL的数据同步 、维护缓存、收集表级别的dml 指标、增量到搜索引擎、数据分区迁移、切库 binlog 回滚方案等等

2.Maxwell架构原理

​ Maxwell的实现原理很简单,就是将自己伪装成MySQL的Slave,并遵循Mysql主从复制的协议,从master中同步数据。

​ 实时读取Mysql数据库的二进制日志–Binlog,从中获取变更数据,再将变更数据以Json的格式发送至Kafka等等流处理平台( Kafka并非唯一输出途径 )

  • MySql二级制日志

    • 二进制日志(Binglog):就是Msyql服务端非常种要的一种日志,保存Msyql数据库的所有数据变更记录Binglog的主要作用包括主从复制和数据恢复。Maxwell的工作原理和主从复制密切相关
    [wangting@hdt-dmcp-ops05 mysql]$ pwd
    /var/lib/mysql
    [wangting@hdt-dmcp-ops05 mysql]$ sudo ls -l | grep mysql-bin
    -rw-r----- 1 mysql mysql     3040 Feb 15 15:05 mysql-bin.000001
    -rw-r----- 1 mysql mysql       19 Feb 15 13:59 mysql-bin.index
    
  • Mysql主从复制

    • Mysql主从复制:就是用来建立一个和主数据库完全一样的数据库环境,这个数据库称为从数据库。
    • 主从复制的应用场景:
      • 热备:主数据库服务器故障后,可切换到从数据库继续工作。
      • 读写分离:主数据库只负责业务数据的写入操作,而多个从数据库只负责业务数据的查询工作,在读多写少场景下,可以提高数据库的工作效率
  • MySQL主从复制原理示意图

  • Mysql主从复制工作原理
    • Master主库接收到数据变更请求,完成数据变更,并将其写到二级制日志(binary log)中。
    • Slave从库向Mysql master发送dump协议,将Master主库的binary log events拷贝到从库的中继日志(relay log)中。
    • Slave从库读取并回放中继日志中的事件,将更新的数据同步到自己的数据库中。

3.Maxwell安装部署

【注意】:

Maxwell-1.30.0及以上的版本不再支持JDK1.8,而JDK1.8支持的最后一个版本为1.29.2

3-1.解压安装

# 下载安装包
[wangting@hdt-dmcp-ops05 software]$ wget https://github.com/zendesk/maxwell/releases/download/v1.29.2/maxwell-1.29.2.tar.gz
# 解压包
[wangting@hdt-dmcp-ops05 software]$ tar -xf maxwell-1.29.2.tar.gz -C /opt/module/
[wangting@hdt-dmcp-ops05 software]$ mv /opt/module/maxwell-1.29.2 /opt/module/maxwell
# 目录结构
[wangting@hdt-dmcp-ops05 maxwell]$ ll
total 84
drwxrwxr-x 2 wangting wangting  4096 Feb 15 13:54 bin
-rw-r--r-- 1 wangting wangting 25133 Jan 25  2021 config.md
-rw-r--r-- 1 wangting wangting 11970 Jan 25  2021 config.properties.example
-rw-r--r-- 1 wangting wangting 10259 Apr 23  2020 kinesis-producer-library.properties.example
drwxr-xr-x 3 wangting wangting 12288 Jan 27  2021 lib
-rw-r--r-- 1 wangting wangting   548 Apr 23  2020 LICENSE
-rw-r--r-- 1 wangting wangting   470 Jan 25  2021 log4j2.xml
-rw-r--r-- 1 wangting wangting  3328 Jan 27  2021 quickstart.md
-rw-r--r-- 1 wangting wangting  1429 Jan 27  2021 README.md

3-2.配置Maxwell的元数据库

  • 启动MySQL-Binlog功能
[wangting@hdt-dmcp-ops05 maxwell]$ sudo vim /etc/my.cnf

[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=row
binlog-do-db=wangtingdb
  • server-id=1

    • 数据库id
  • log-bin=mysql-bin

    • 启动Binlog,该参数的值会作为binlog的文件名前缀
  • binlog_format=row

    • binlog类型,maxwell要求为row类型
  • binlog-do-db=wangtingdb

    • 启动binlog的数据库,需根据实际情况修改配置
  • 重启MySQL下载新配置项
[wangting@hdt-dmcp-ops05 maxwell]$ sudo systemctl restart mysqld
  • 创建Maxwell所需数据库和用户
[wangting@hdt-dmcp-ops05 maxwell]$ mysql -uroot -h172.20.12.179 -p
# 创建数据库
mysql> create database maxwell character set utf8mb4;
Query OK, 1 row affected (0.00 sec)
# 创建Maxwell用户
mysql> create user 'maxwell'@'%' identified by 'maxwell';
Query OK, 0 rows affected (0.00 sec)
# 赋予其必要权限
mysql> grant all on maxwell.* to 'maxwell'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> grant select, replication client, replication slave on *.* to 'maxwell'@'%';
Query OK, 0 rows affected (0.01 sec)
# 刷新配置
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit;
Bye

[wangting@hdt-dmcp-ops05 maxwell]$ mysql -umaxwell -pmaxwell -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| wangtingdb         |
| maxwell            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

3-3.配置Maxwell

[wangting@hdt-dmcp-ops05 maxwell]$ mv config.properties.example config.properties
[wangting@hdt-dmcp-ops05 maxwell]$ vim config.properties
# Maxwell数据发送目的地,可选配置有stdout|file|kafka|kinesis|pubsub|sqs|rabbitmq|redis
producer=kafka
# 目标Kafka集群地址
kafka.bootstrap.servers=hdt-dmcp-ops01:9092,hdt-dmcp-ops02:9092,hdt-dmcp-ops03:9092
# 目标Kafka topic,可静态配置,例如:maxwell,也可动态配置,例如:%{database}_%{table}
kafka_topic=maxwell

#MySQL相关配置
host=hdt-dmcp-ops05
user=maxwell
password=maxwell
jdbc_options=useSSL=false&serverTimezone=Asia/Shanghai

注意:若Maxwell发送数据的目的地是kafka集群,需要首先将kafka集群启动

3-4.命令启动停止服务

  • 命令行直接使用
# 启动Maxwell
[wangting@hdt-dmcp-ops05 maxwell]$ /opt/module/maxwell/bin/maxwell --config /opt/module/maxwell/config.properties --daemon

# 停止Maxwell
[wangting@hdt-dmcp-ops05 maxwell]$ ps -ef | grep maxwell | grep -v grep | awk '{print $2}' | xargs kill -9
  • 启动停止脚本
[wangting@hdt-dmcp-ops05 bin]$ vim mymaxwell
#!/bin/bash

MAXWELL_HOME=/opt/module/maxwell

status_maxwell(){
    result=`ps -ef | grep com.zendesk.maxwell.Maxwell | grep -v grep | wc -l`
    return $result
}


start_maxwell(){
    status_maxwell
    if [[ $? -lt 1 ]]; then
        echo "启动Maxwell"
        $MAXWELL_HOME/bin/maxwell --config $MAXWELL_HOME/config.properties --daemon
    else
        echo "Maxwell正在运行"
    fi
}


stop_maxwell(){
    status_maxwell
    if [[ $? -gt 0 ]]; then
        echo "停止Maxwell"
        ps -ef | grep com.zendesk.maxwell.Maxwell | grep -v grep | awk '{print $2}' | xargs kill -9
    else
        echo "Maxwell未在运行"
    fi
}


case $1 in
    start )
        start_maxwell
    ;;
    stop )
        stop_maxwell
    ;;
    restart )
       stop_maxwell
	   sleep 1
       start_maxwell
    ;;
esac
[wangting@hdt-dmcp-ops05 bin]$ chmod +x mymaxwell
[wangting@hdt-dmcp-ops05 bin]$ mymaxwell stop
停止Maxwell
[wangting@hdt-dmcp-ops05 bin]$ mymaxwell start
启动Maxwell

4.Maxwell功能使用

4-1.增量同步数据测试

  • 在配置binlog开启的库中创建测试表
[wangting@hdt-dmcp-ops05 maxwell]$ mysql -uroot -p123456

mysql> use wangtingdb;
Database changed

mysql> create table test(id int,name varchar(20));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into test value(1,"wang");
Query OK, 1 row affected (0.01 sec)

mysql> insert into test value(2,"wang2");
Query OK, 1 row affected (0.01 sec)

mysql>
  • 观察Maxwell的日志变化
[wangting@hdt-dmcp-ops05 maxwell]$ tail -f logs/MaxwellDaemon.out
        value.serializer = class org.apache.kafka.common.serialization.StringSerializer

14:39:07,612 INFO  AppInfoParser - Kafka version : 1.0.0
14:39:07,612 INFO  AppInfoParser - Kafka commitId : aaa7af6d4a11b29d
14:39:07,626 INFO  Maxwell - Maxwell v1.29.2 is booting (MaxwellKafkaProducer), starting at Position[BinlogPosition[mysql-bin.000001:977], lastHeartbeat=0]
14:39:07,756 INFO  MysqlSavedSchema - Restoring schema id 1 (last modified at Position[BinlogPosition[mysql-bin.000001:977], lastHeartbeat=0])
14:39:07,809 INFO  BinlogConnectorReplicator - Setting initial binlog pos to: mysql-bin.000001:977
14:39:07,819 INFO  BinaryLogClient - Connected to hdt-dmcp-ops05:3306 at mysql-bin.000001/977 (sid:6379, cid:36)
14:39:07,819 INFO  BinlogConnectorReplicator - Binlog connected.
14:44:48,333 INFO  AbstractSchemaStore - storing schema @Position[BinlogPosition[mysql-bin.000001:1042], lastHeartbeat=0] after applying "create table test(id int,name varchar(20))" to wangtingdb, new schema id is 2
  • 打开Kafka-console消费消息
[wangting@hdt-dmcp-ops01 ~]$ kafka-console-wangtingdb.sh --topic maxwell --from-beginning --bootstrap-server hdt-dmcp-ops01:9092,hdt-dmcp-ops02:9092,hdt-dmcp-ops03:9092
{"database":"wangtingdb","table":"test","type":"insert","ts":1676443636,"xid":1687,"commit":true,"data":{"id":1,"name":"wang"}}
{"database":"wangtingdb","table":"test","type":"insert","ts":1676443644,"xid":1709,"commit":true,"data":{"id":2,"name":"wang2"}}

将消息格式化显示便于理解:

{
	"database": "wangtingdb",
	"table": "test",
	"type": "insert",
	"ts": 1676443636,
	"xid": 1687,
	"commit": true,
	"data": {
		"id": 1,
		"name": "wang"
	}
}

{
	"database": "wangtingdb",
	"table": "test",
	"type": "insert",
	"ts": 1676443644,
	"xid": 1709,
	"commit": true,
	"data": {
		"id": 2,
		"name": "wang2"
	}
}
  • 更新MySQL数据
mysql> update test set name = 'wang111' where id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

查看Kafka变化

[wangting@hdt-dmcp-ops01 ~]$ kafka-console-wangtingdb.sh --topic maxwell --from-beginning --bootstrap-server hdt-dmcp-ops01:9092,hdt-dmcp-ops02:9092,hdt-dmcp-ops03:9092
{"database":"wangtingdb","table":"test","type":"insert","ts":1676443636,"xid":1687,"commit":true,"data":{"id":1,"name":"wang"}}
{"database":"wangtingdb","table":"test","type":"insert","ts":1676443644,"xid":1709,"commit":true,"data":{"id":2,"name":"wang2"}}
# 新增了如下更新消息
{"database":"wangtingdb","table":"test","type":"update","ts":1676444034,"xid":2569,"commit":true,"data":{"id":1,"name":"wang111"},"old":{"name":"wang"}}  
# 格式化如下:
{
	"database": "wangtingdb",
	"table": "test",
	"type": "update",
	"ts": 1676444034,
	"xid": 2569,
	"commit": true,
	"data": {
		"id": 1,
		"name": "wang111"
	},
	"old": {
		"name": "wang"
	}
}
  • 删除MySQL数据
mysql> delete from test where id = 2;
Query OK, 1 row affected (0.00 sec)

查看Kafka变化

[wangting@hdt-dmcp-ops01 ~]$ kafka-console-wangtingdb.sh --topic maxwell --from-beginning --bootstrap-server hdt-dmcp-ops01:9092,hdt-dmcp-ops02:9092,hdt-dmcp-ops03:9092
{"database":"wangtingdb","table":"test","type":"insert","ts":1676443636,"xid":1687,"commit":true,"data":{"id":1,"name":"wang"}}
{"database":"wangtingdb","table":"test","type":"insert","ts":1676443644,"xid":1709,"commit":true,"data":{"id":2,"name":"wang2"}}
{"database":"wangtingdb","table":"test","type":"update","ts":1676444034,"xid":2569,"commit":true,"data":{"id":1,"name":"wang111"},"old":{"name":"wang"}}
# 新增了如下更新消息
{"database":"wangtingdb","table":"test","type":"delete","ts":1676444127,"xid":2777,"commit":true,"data":{"id":2,"name":"wang2"}}
# 格式化如下:
{
	"database": "wangtingdb",
	"table": "test",
	"type": "delete",
	"ts": 1676444127,
	"xid": 2777,
	"commit": true,
	"data": {
		"id": 2,
		"name": "wang2"
	}
}

4-2.Maxwell全量数据同步

使用 Maxwell-bootstrap 命令

Maxwell提供了bootstrap命令功能来进行历史数据的全量同步,( 但依然前提要运行一个maxwell )

  • 创建样例数据
mysql> select * from test;
+------+---------+
| id   | name    |
+------+---------+
|    1 | wang111 |
+------+---------+
1 row in set (0.00 sec)

mysql> insert into test value(2,"wang222");
Query OK, 1 row affected (0.00 sec)

mysql> insert into test value(3,"wang333");
Query OK, 1 row affected (0.00 sec)

mysql> insert into test value(4,"wang444");
Query OK, 1 row affected (0.01 sec)

mysql> select * from test;
+------+---------+
| id   | name    |
+------+---------+
|    1 | wang111 |
|    2 | wang222 |
|    3 | wang333 |
|    4 | wang444 |
+------+---------+
4 rows in set (0.00 sec)
  • 提前开启Kafka消费消息窗口
[wangting@hdt-dmcp-ops01 ~]$ kafka-console-wangtingdb.sh --topic maxwell --bootstrap-server hdt-dmcp-ops01:9092,hdt-dmcp-ops02:9092,hdt-dmcp-ops03:9092

# 此时无消息,在等待消费消息中
  • 开始全量同步历史数据
# 查看Maxwell服务是否运行
[wangting@hdt-dmcp-ops05 bin]$ ps -ef | grep com.zendesk.maxwell.Maxwell | grep -v grep
wangting 22431     1  0 15:06 pts/2    00:00:08 /opt/module/java/bin/java -Dfile.encoding=UTF-8 -Dlog4j.shutdownCallbackRegistry=com.djdch.log4j.StaticShutdownCallbackRegistry -cp :/opt/module/maxwell/bin/../lib/*:/opt/module/maxwell/bin/../lib/kafka-clients/kafka-clients-1.0.0.jar com.zendesk.maxwell.Maxwell --config /opt/module/maxwell/config.properties --daemon
# 
[wangting@hdt-dmcp-ops05 bin]$ cd /opt/module/maxwell/
[wangting@hdt-dmcp-ops05 maxwell]$ bin/maxwell-bootstrap --database wangtingdb --table test --config config.properties
connecting to jdbc:mysql://hdt-dmcp-ops05:3306/maxwell?allowPublicKeyRetrieval=true&connectTimeout=5000&serverTimezone=Asia%2FShanghai&zeroDateTimeBehavior=convertToNull&useSSL=false
  • 回到Kafka消费窗口查看
[wangting@hdt-dmcp-ops01 ~]$ kafka-console-wangtingdb.sh --topic maxwell --bootstrap-server hdt-dmcp-ops01:9092,hdt-dmcp-ops02:9092,hdt-dmcp-ops03:9092
{"database":"wangtingdb","table":"test","type":"bootstrap-start","ts":1676444947,"data":{}}
{"database":"wangtingdb","table":"test","type":"bootstrap-insert","ts":1676444947,"data":{"id":1,"name":"wang111"}}
{"database":"wangtingdb","table":"test","type":"bootstrap-insert","ts":1676444947,"data":{"id":2,"name":"wang222"}}
{"database":"wangtingdb","table":"test","type":"bootstrap-insert","ts":1676444947,"data":{"id":3,"name":"wang333"}}
{"database":"wangtingdb","table":"test","type":"bootstrap-insert","ts":1676444947,"data":{"id":4,"name":"wang444"}}
{"database":"wangtingdb","table":"test","type":"bootstrap-complete","ts":1676444947,"data":{}}

【注意】:

  1. 虽然是4条数据但对应了6条消息
  2. 第一条type为bootstrap-start和最后一条type为bootstrap-complete的数据,是bootstrap开始和结束的标志,不包含数据,中间的type为bootstrap-insert的才是包含数据
  3. 一次bootstrap输出的所有记录的ts都是相同的,为bootstrap开始的时间1676444947 -> 2023-02-15 15:09:07

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

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

相关文章

【DockerCE】Docker-CE 23.0.1正式版发布

很意外啊!Docker社区版竟然直接从20.xx.xx版本,升级到23.xx.xx版本了。官网地址(For RHEL/CentOS 7.9):https://download.docker.com/linux/centos/7/x86_64/stable/Packages/23.0.1版本官方安装包如下:# l…

给初级开发人员的建议

#初学者#生产率#代码新手#学习在我超过 15 年的开发生涯中,我学到了一些可以显着提高我的效率的东西。在这篇文章中,我将与您分享这些经验教训。结构:基础建议——以下内容的重要背景和动机技术咨询——主菜推荐读物——指向非常适合入门的高…

30-Golang中的排序和查找

排序和查找排序的基本介绍交换式排序法交换式排序法-冒泡排序查找顺序查找二分查找排序的基本介绍 排序是将一组数据,依指定的顺序进行排列的过程 排序的分类: 1.内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换…

20N65-ASEMI高压MOS管20N65

编辑-Z 20N65在ITO-220AB封装里的静态漏极源导通电阻(RDS(ON))为0.42Ω,是一款N沟道高压MOS管。20N65的最大脉冲正向电流ISM为80A,零栅极电压漏极电流(IDSS)为10uA,其工作时耐温度范围为-55~150摄氏度。20N65功耗&…

Spring Boot最核心的27个注解,你了解多少?

https://blog.csdn.net/ManuMAX/article/details/129017443 导读 Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringCloud集成…

前端学习第一阶段——第五章CSS(下)

5-9 浮动 08-浮动导读 09-传统网页布局三种方式 10-为什么需要浮动 11-什么是浮动 12-浮动特性-脱标 13-浮动特性-浮动元素一行显示 14-浮动特性-浮动元素具有行内块特性 15-浮动元素经常搭配标准流的父元素 16-浮动布局练习1 <!DOCTYPE html> <html lang"en&quo…

从青铜到王者,揭秘 Serverless 自动化函数最佳配置

作者&#xff1a;丛霄 背景介绍 全托管的 Serverless 计算平台能给用户带来更少的运维代价、更强的稳定性和更快的弹性能力。 Serverless 的目标之一是免运维&#xff0c;但仍旧存在一些障碍&#xff0c;在 Serverless 场景特有的一些关键服务配置比如**“并发度”、“最小实…

史上最详细的PyCharm快速上手指南,你值得拥有

上一节中我们介绍了Python并安装了环境&#xff0c;有了Python环境我们就可以开发了吗&#xff1f;各位朋友们。 也可以也不可以&#xff01;哈哈哈不要怪我朋友们&#xff0c;我说的是事实。 如果你喜欢Python自带的Python命令开发&#xff0c;即我们所说的交互式&#xff0…

5.33 综合案例2.0 -ESP32拍照上传阿里云OSS

综合案例2.0 - ESP32拍照上传阿里云OSS案例说明连线功能实现1.阿里云平台连接2.OSS对象存储服务3.ESP32-CAM开发环境4.代码ESP32-CAM开发板代码HaaS506开发板代码测试数据转图片方法案例说明 使用ESP32拍照,将照片数据上传阿里云OSS&#xff08;通过4G网络上传&#xff09;。 …

【ArcGIS Pro二次开发】(4):ArcGIS Pro封装的窗体控件

在ArcGIS Pro&#xff0c;有一类窗体控件是系统已经封装好的&#xff0c;比如消息框、提醒框等。下面通过代码来学习一下。 新建一个项目&#xff0c;命名为【ProWindow】&#xff0c;添加5个按钮&#xff0c;命名为【Show_MessageBox、Show_NoticeBox、Show_OpenDialog、Show…

交通部互通互联码的根证书规则

引言 为了更好的服务交通互通互联码而更新这篇文章。 中金根证书其实是可以自己生成的。 代码内调整 中心公钥索引要保证自己的唯一性。 此处的唯一&#xff0c;是要保证在机具侧的唯一&#xff0c;因为他要根据这个索引去查找证书以及公钥。 提供根公钥给机具侧 生成的公钥…

“黑洞”竟是外星人的量子计算机?

宇宙中的黑洞可以用作终极量子计算机&#xff0c;我们可以从中探索它们的特征。&#xff08;图片来源&#xff1a;网络&#xff09;我们完全有理由怀疑生命在我们的宇宙中很常见&#xff0c;但是为什么我们从未发现过其他生命存在的迹象&#xff1f;这个问题几乎自现代天文学诞…

JavaScript 教程

手册简介JavaScript 是世界上最流行的脚本语言。 JavaScript 是属于 web 的语言&#xff0c;它适用于 PC、笔记本电脑、平板电脑和移动电话。 JavaScript 被设计为向 HTML 页面增加交互性。 许多 HTML 开发者都不是程序员&#xff0c;但是 JavaScript 却拥有非常简单的语法。几…

SpringBoot Data JPA配置多数据源

SpringBoot Data JPA配置多数据源1. Dependency2. Application.properties3. Code3.1 Datasource config3.2 Primary Config3.3 Second Config4. Awakening1. Dependency <dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>mssql-jd…

常用设计模式介绍

java设计模式类型创建型模式&#xff1a;将对象的创建与使用分离结构型模式&#xff1a;如何将类和对象按照某种布局组成更大的格局行为型模式&#xff1a;用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务23种设计模式介绍1.单例&#xff08;Singleton&…

linux高级命令之软件安装

软件安装学习目标能够使用apt-get命令安装软件1. 软件安装的介绍Ubuntu软件安装有两种方式:离线安装(deb文件格式安装&#xff09;在线安装(apt-get方式安装)2. deb文件格式安装是 Ubuntu 的安装包格式&#xff0c;可以使用 dpkg 命令进行软件的安装和卸载。命令说明dpkg安装和…

以“大数据”赋能产业链精准招商

​ 随着我国产业发展的不断迭代升级&#xff0c;传统招商模式的不足逐步凸显&#xff0c;侧重土地与税费优惠的同质化竞争招商以及来者不拒的无门槛型招商已经遏制了区域产业的发展&#xff0c;导致各产业园区很难形成产业集聚及持续的吸引力。在这样的大环境下&#xff0c;产业…

使用LogToHtml导出Airtest报告

simple_report接口&#xff0c;是个简化版的生成报告接口&#xff0c;如果仅仅需要在本地查看的话&#xff0c;用这个接口即可。 但是如果需要导出报告&#xff0c;即他人也可以正常查看&#xff0c;则需要用LogToHtml类。 参数解释 script_root&#xff0c;脚本路径 log_ro…

论一个上班族如何一次性通过PMP考试

PMP是我工作后考取的一个证书。从准备到通过&#xff0c;花了大约三个月的时间。我之前在某家互联网公司从事程序员的工作&#xff0c;工作一段时间后&#xff0c;天天敲着代码&#xff0c;改着bug&#xff0c;感觉比较迷茫&#xff0c;不知道未来的发展在哪里&#xff0c;都说…

Viper捐款7000万韩元,合计人民币是多少钱?

Viper捐款7000万韩元&#xff0c;合计人民币是多少钱&#xff1f; #2023LCK春季赛##英雄联盟# #Viper捐款7000万韩元# Viper向大田东区捐款 7000 万&#xff0c;成为大田荣誉协会 105 号会员。Viper选手从 2019 年开始一直向大田东区捐款&#xff0c;但是他不希望这件事被公开…