当前位置: 首页 > news >正文

达梦主备部署

达梦主备部署

  • 一.概括
    • 1)环境软件下载
    • 2)集群规划
  • 二.安装
    • 1)安装前
    • 2)安装数据库
  • 三.主备机器部署
    • 1)初始化数据库
      • (1)主库配置
      • (2)备库配置
    • 2)脱机备份
      • (1)主服务器上备份
      • (2)备服务上还原更新
      • (3)注释
    • 3)启动服务器
      • (1)主服务器上
      • (3)备服务器上
      • (3)监控服务器上
    • 4)添加服务实现开机自启
  • 四.odbc驱动链接

一.概括

1)环境软件下载

环境:centos7 x86
达梦版本开发版:dm8_20231011_x86_rh6_64
下载地址官网下载:https://eco.dameng.com/download/?_blank
百度网盘下载:链接:https://pan.baidu.com/s/15nG4oRGf0BzEzZf3QQXubw  提取码:cc69
odbc驱动下载:https://developer.aliyun.com/packageSearch?word=unixodbc

2)集群规划

组名称组ID
GDW145331
dmserver的IPdmwatcher的IPdmserver名称dmserver端口号MAL端口MAL守护进程端口dmwatcher端口
192.168.1.5192.168.1.5DW1_015236533654365536
192.168.1.6192.168.1.6DW1_01B5236533654365536
dmmonitor的IP192.168.1.7监视器----

二.安装

192.168.1.5、192.168.1.6、192.168.1.7都要安装

1)安装前

创建组和用户,挂载磁盘。
1.创建用户组

groupadd dinstall

2.创建用户

useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba

3.修改用户密码

passwd dmdba

4.修改文件最大打开数

vi /etc/security/limits.conf

在文件最后添加以下四句话

dmdba hard nofile 65536
dmdba soft nofile 65536
dmdba hard stack 32768
dmdba soft stack 16384

切换 dmdba用户查看是否生效

su - dmdba
ulimit -a

5.挂载磁盘
切换到root用户下,将.iso文件放到/opt目录下,执行如下命令挂载磁盘

su root
mount -o loop /opt/dm8_20231011_x86_rh6_64.iso /mnt

6.修改tmp文件大小

mount -o remount,size=3G /tmp

7.创建安装目录,修改权限

mkdir /dm8
chown dmdba:dinstall -R /dm8/
chmod -R 755 /dm8

2)安装数据库

1.安装

su - dmdba
cd /mnt/
./DMInstall.bin -i
1.默认中文
2.key: n
3.是否设置时区:y默认21
4.典型安装
5.安装目录:/dm8
6.确认安装路径/dm8: y

2.创建DmAPService
否则影响脱机备份

su root
/dm8/script/root/root_installer.sh

三.主备机器部署

以下操作都是在登录用户dmdba下执行

1)初始化数据库

(1)主库配置

1.初始化实例

source ~/.bash_profile 
/dm8/bin/dminit path=/dm8/data/ page_size=32 extent_size=32 CASE_SENSITIVE=1 CHARSET=1  LOG_SIZE=2048 INSTANCE_NAME=DW1_01

2.启动服务器,启动diqsl,通过disql修改dm.ini配置

cd /dm8/bin
./dmserver /dm8/data/DAMENG/dm.ini

新开控制台执行

cd /dm8/tool
./disql
SQL>conn SYSDBA/SYSDBA;
SP_SET_PARA_VALUE (2,'PORT_NUM',5236);
SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60);
SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0);
SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2);
SP_SET_PARA_VALUE (2,'MAL_INI',1);
SP_SET_PARA_VALUE (2,'ARCH_INI',1);
SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64);

3.创建dmmal.ini主备配置文件

[dmdba@~]# vi /dm8/data/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL         = 10  #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL     = 10  #判定MAL链路断开的时间
MAL_TEMP_PATH              = /dm8/data/malpath/  #临时文件目录
MAL_BUF_SIZE               = 512  #单个MAL缓存大小,单位MB
MAL_SYS_BUF_SIZE           = 2048  #MAL总大小限制,单位MB
MAL_COMPRESS_LEVEL         = 0  #MAL消息压缩等级,0表示不压缩[MAL_INST1]MAL_INST_NAME            = DW1_01  #实例名,和 dm.ini的INSTANCE_NAME一致MAL_HOST                 = 192.168.1.5  #MAL系统监听TCP连接的IP地址MAL_PORT                 = 5336  #MAL系统监听TCP连接的端口MAL_INST_HOST            = 192.168.1.5  #实例的对外服务IP地址MAL_INST_PORT            = 5236  #实例对外服务端口,和dm.ini的PORT_NUM一致MAL_DW_PORT              = 5436  #实例对应的守护进程监听TCP连接的端口MAL_INST_DW_PORT         = 5536  #实例监听守护进程TCP连接的端口[MAL_INST2]MAL_INST_NAME            = DW1_01BMAL_HOST                 = 192.168.1.6MAL_PORT                 = 5336MAL_INST_HOST            = 192.168.1.6MAL_INST_PORT            = 5236MAL_DW_PORT              = 5436MAL_INST_DW_PORT         = 5536

4.创建dmarch.ini归档文件
主库需要同步至备库,所以ARCH_DEST对应备库名称

[dmdba@~]# vi /dm8/data/DAMENG/dmarch.ini
[ARCHIVE_LOCAL]ARCH_TYPE                = LOCAL  #本地归档类型ARCH_DEST                = /dm8/data/DAMENG/arch/  #本地归档存放路径ARCH_FILE_SIZE           = 1024  #单个归档大小,单位MBARCH_SPACE_LIMIT         = 51200  #归档上限,单位MB
[ARCHIVE_REALTIME]ARCH_TYPE                = REALTIME  #实时归档类型ARCH_DEST                = DW1_01B  #实时归档目标实例名

5.创建dmwatcher.ini守护进程配置文件

[dmdba@~]# vi /dm8/data/DAMENG/dmwatcher.ini
[GDW1]DW_TYPE                  = GLOBAL  #全局守护类型DW_MODE                  = AUTO  #故障自动切换模式 DW_ERROR_TIME            = 20  #远程守护进程故障认定时间INST_ERROR_TIME          = 20  #本地实例故障认定时间INST_RECOVER_TIME        = 60  #主库守护进程启动恢复的间隔时间INST_OGUID               = 45331  #守护系统唯一OGUID值INST_INI                 = /dm8/data/DAMENG/dm.ini  #dm.ini文件路径INST_AUTO_RESTART        = 1  #打开实例的自动启动功能INST_STARTUP_CMD         = /dm8/bin/dmserver  #命令行方式启动RLOG_SEND_THRESHOLD      = 0  #指定主库发送日志到备库的时间阈值,默认关闭RLOG_APPLY_THRESHOLD     = 0  #指定备库重演日志的时间阈值,默认关闭

(2)备库配置

1.初始化实例

/dm8/bin/dminit path=/dm8/data/ page_size=32 extent_size=32 CASE_SENSITIVE=1 CHARSET=1  LOG_SIZE=2048 INSTANCE_NAME=DW1_01B

2.将主库的dm.ini、dmmal.ini、dmarch.ini、dmwatcher.ini的四个文件拷贝到/dm8/data/DAMENG/下

3.修改dm.ini

INSTANCE_NAME                   = DW1_01B

4.修改dmarch.ini

  ARCH_DEST                = DW1_01  #实时归档目标实例名
  1. 启动服务器,初始化数据库
cd /dm8/bin
./dmserver /dm8/data/DAMENG/dm.ini

2)脱机备份

即使是新dmini的数据,不做备份还原处理,主备服务器状态会一直是mount

(1)主服务器上备份

cd /dm8/bin
./dmrman CTLSTMT="BACKUP DATABASE '/dm8/data/DAMENG/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET  '/dm8/data/BACKUP_FILE_01'"

将备份生成的文件BACKUP_FILE_01拷贝到备库服务器的/dm8/data/DAMENG/下

(2)备服务上还原更新

cd /dm8/bin
./dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/data/BACKUP_FILE_01'"
./dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' UPDATE DB_MAGIC"

(3)注释

备份还原如果提示:[-7170]:bakres连接DMAP失败

cd /dm8/bin
./DmAPService start

3)启动服务器

(1)主服务器上

1.启动主服务器

cd /dm8/bin
./dmserver /dm8/data/DAMENG/dm.ini mount

2.新开控制台,disql设置主机模式

cd /dm8/tool
./disql
SQL>conn SYSDBA/SYSDBA;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(45331);
alter database standby; 
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

3.启动守护进程

cd /dm8/bin
./dmwatcher /dm8/data/DAMENG/dmwatcher.ini

(3)备服务器上

1.启动主服务器

cd /dm8/bin
./dmserver /dm8/data/DAMENG/dm.ini mount

2.新开控制台,disql设置备机模式

cd /dm8/tool
./disql
SQL>conn SYSDBA/SYSDBA;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(45331);
alter database standby; 
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

3.启动守护进程

cd /dm8/bin
./dmwatcher /dm8/data/DAMENG/dmwatcher.ini

(3)监控服务器上

1.添加dmmonitor.ini 监控服务配置

[dmdba@~]# vi /dm8/monitor/dmmonitor.ini
MON_DW_CONFIRM             = 1  #0为非确认,1为确认
MON_LOG_PATH               = /dm8/monitor/log  #监视器日志文件存放路径
MON_LOG_INTERVAL           = 60  #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE          = 512  #单个日志大小,单位MB
MON_LOG_SPACE_LIMIT        = 2048  #日志上限,单位MB[GDW1]MON_INST_OGUID           = 45331  #组GDW1的唯一OGUID 值MON_DW_IP                = 192.168.1.5:5436  #IP对应MAL_HOST,PORT对应MAL_DW_PORTMON_DW_IP                = 192.168.1.6:5436

2.启动监控服务器

cd /dm8/bin
./dmmonitor /dm8/monitor/dmmonitor.ini

4)添加服务实现开机自启

cd /dm8/script/root/
./dm_service_installer.sh -t dmserver -dm_ini /dm8/data/DAMENG/dm.ini -p DMSERVER
./dm_service_installer.sh -t dmwatcher -watcher_ini /dm8/data/DAMENG/dmwatcher.ini -p A
./dm_service_installer.sh -t dmmonitor -monitor_ini /dm8/monitor/dmmonitor.ini -p M

DmServiceDMSERVER
DmWatcherServiceA
DmMonitorServiceM

四.odbc驱动链接

1.安装驱动后查看配置

[root@localhost dm8]# odbcinst -j
unixODBC 2.3.7
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

2.修改:\etc\dm_svc.conf

DMHA=(192.168.1.5:5236,192.168.1.6:5236)
LOGIN_MODE=(1) 
SWITCH_TIMES=(3)
SWITCH_INTERVAL=(100) 

LOGIN_MODE=(1):只连接主库
SWITCH_TIMES=(3):以服务名连接库时,若未找到符合条件的库建立连接,将尝试遍历服务名中库列表的次数
SWITCH_INTERVAL=(100):在服务器之间切换的时间间隔,单位为毫秒

3.修改:\etc\odbc.ini

[dm8]
Description = DM ODBC DSN
Driver = DM8 ODBC DRIVER
SERVER = DMHA
UID = SYSDBA
PWD = SYSDBA
TCP_PORT = 5236

4.检测链接

[root@localhost dm8]# isql -v DM8
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

相关文章:

达梦主备部署

达梦主备部署 一.概括1)环境软件下载2)集群规划 二.安装1)安装前2)安装数据库 三.主备机器部署1)初始化数据库(1)主库配置(2)备库配置 2)脱机备份(1)主服务器…...

后期混音效果全套插件Waves 14 Complete mac中文版新增功能

Waves 14 Complete for Mac是一款后期混音效果全套插件,Waves音频插件,内置混响,压缩,降噪和EQ等要素到建模的模拟硬件,环绕声和后期制作工具,包含全套音频效果器,是可以让你使用所有功能。Waves 14 Comple…...

HTML5笔记

前端学习笔记专栏区别于官网中全面的知识讲解&#xff0c;主要记录学习技术栈时对于重点内容的提炼&#xff0c;便于对技术栈知识的快速回顾以及使用 1.canvas元素 内部坐标&#xff1a;坐标均以左上角为(0, 0)&#xff0c;单一坐标均作为起始坐标创建对象&#xff1a; <c…...

前端架构师需要解决那些问题

假设你是一个大型后台管理系统的前端架构师&#xff0c;你需要解决那些问题&#xff1f; 1、Ui设计规范 大型系统UI得统一吧&#xff1f;各个业务模块的UI设计得高效吧&#xff1f;那就得有规范&#xff0c;直观的说就是原子设计那套东西。加一堆推荐设计稿。 2、基础组件库…...

使用python快速搭建接口自动化测试脚本实战总结

导读 本文将介绍如何使用python快速进行http/https接口自动化测试脚本搭建&#xff0c;实现自动请求、获取结果、数据对比分析&#xff0c;导出结果到Excel等功能&#xff0c;包括python的requests、pandas、openpyxl等库的基本使用方法。 测试需求介绍 通常&#xff0c;在我…...

android studio 字节码查看工具jclasslib bytecode viewer

jclasslib bytecode viewer 是一款非常好用的.class文件查看工具&#xff1b; jclasslib bytecode editor is a tool that visualizes all aspects of compiled Java class files and the contained bytecode. Many aspects of class files can be edited in the UI. In addit…...

Ubuntu上搭建FTP服务

要在Ubuntu上搭建FTP服务器&#xff0c;可以使用常见的FTP服务器软件如vsftpd&#xff08;Very Secure FTP Daemon&#xff09;或ProFTPD。以下是使用vsftpd在Ubuntu上设置FTP服务器的基本步骤&#xff1a; 步骤 1: 安装 vsftpd 打开终端并运行以下命令安装 vsftpd&#xff1a…...

unity打AB包,AssetBundle预制体与图集(三)

警告&#xff1a; spriteatlasmanager.atlasrequested wasn’t listened to while 条件一&#xff1a;图片打图集里面去了 条件二&#xff1a;然后图集打成AB包了 条件三&#xff1a;UI预制体也打到AB包里面去了 步骤一&#xff1a;先加载了图集 步骤二&#xff1a;再加载UI预…...

在Javascript中为什么 0.1+0.2 不等于0.3 ? 源代码详细解析

在JavaScript中&#xff0c;浮点数计算可能会导致精度问题&#xff0c;这就是为什么0.1 0.2不等于0.3的原因。这是因为JavaScript使用IEEE 754标准来表示浮点数&#xff0c;而该标准使用二进制来表示小数。 让我们通过一个实例来详细解释这个问题。考虑以下代码&#xff1a; …...

MATLAB|热力日历图

目录 日历图介绍&#xff1a; 热力日历图的特点&#xff1a; 应用场景&#xff1a; 绘图工具箱 属性 (Properties) 构造函数 (Constructor) 公共方法 (Methods) 私有方法 (Private Methods) 使用方法 日历图介绍&#xff1a; 热力日历图是一种数据可视化形式&#xf…...

《golang设计模式》第三部分·行为型模式-05-仲裁者/中介模式(Mediator)

文章目录 1. 概述1.1 作用1.2 角色1.3 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 仲裁者&#xff08;Mediator&#xff09;可以封装和协调多个对象之间的耦合交互行为&#xff0c;以减弱这些对象之间的耦合关联。 1.1 作用 将多个对象相互耦合的设计转变为所有对象…...

7天入门python系列之准备工作

寄语 编者打算开一个python 初学主题的系列文章&#xff0c;用于指导想要学习python的同学。关于文章有任何疑问都可以私信作者。对于初学者想在7天内入门Python&#xff0c;这是一个紧凑的学习计划。但并不是不可完成的。 7天的安排 如果你想在7天内入门Python&#xff0c;…...

Go语言~反射

reflect包 type name和type kindValueOf通过反射获取值通过反射设置变量的值 package mainimport ("fmt""reflect" )func reflectType(x interface{}) {obj : reflect.TypeOf(x)fmt.Println(obj, obj.Name(), obj.Kind())fmt.Printf("obj type of %…...

详解交叉验证中【KFold】【Stratified-KFold】【StratifiedShuffleSplit】的区别

交叉验证是一种统计分析方法&#xff0c;它的目的是通过在同一数据集上重复并分割训练和测试数据&#xff0c;来评估机器学习模型的性能。以下是​这三种交叉验证方法的区别&#xff1a; KFold&#xff08;K-折叠&#xff09; 在KFold交叉验证中&#xff0c;原始数据集被分为K个…...

数学建模比赛中常用的建模提示词(数模prompt)

以下为数学建模比赛中常用的建模提示词&#xff0c;希望对你有所帮助&#xff01; 帮我总结一下数学建模有哪些预测类算法&#xff1f; 灰色预测模型级比检验是什么意思? 描述一下BP神经网络算法的建模步骤 对于分类变量与分类变量相关性分析用什么算法 前10年的数据分别是1&a…...

Spark 新特性+核心回顾

Spark 新特性核心 本文来自 B站 黑马程序员 - Spark教程 &#xff1a;原地址 1. 掌握Spark的Shuffle流程 1.1 Spark Shuffle Map和Reduce 在Shuffle过程中&#xff0c;提供数据的称之为Map端&#xff08;Shuffle Write&#xff09;接收数据的称之为Reduce端&#xff08;Sh…...

STM32 TIM定时器,配置,详解(1)

计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR)。 PSC预分频器&#xff0c;顾名思义&#xff0c;先预备一下分频&#xff0c;有时候频率过高&#xff0c;后面的定时器承受不住&#xff0c;就先用PSC先分频一下。如何分频的&#xff1f;将每接受到…...

Helix Toolkit:为.NET开发者带来的3D视觉盛宴

推荐一个基于.Net开源的3、功能强大的3D图形库和工具包&#xff0c;适用于WPF应用程序的3D渲染和开发。 01 项目简介 Helix Toolkit是一个开源的3D库&#xff0c;主要用于WPF应用程序。它有许多优点&#xff0c;例如提供各种各样的功能&#xff0c;包括基于MVVM的3D模型编辑器…...

PHP分类信息网站源码系统 电脑+手机+微信端三合一 带完整前后端部署教程

大家好啊&#xff01;今天源码小编来给大家分享一款PHP分类信息网站类源码系统。这款源码系统是一套专业的信息发布类网站综合管理系统&#xff0c;适合各类地方信息和行业分类站点建站。随着这几年我们国家网民爆炸式的增 长&#xff0c;网络信息也随之越来越庞大&#xff0c;…...

2023年辽宁省数学建模竞赛B题数据驱动的水下导航适配区分类预测

2023年辽宁省数学建模竞赛 B题 数据驱动的水下导航适配区分类预测 原题再现&#xff1a; “海洋强国”战略部署已成为推动中国现代化建设的重要组成部分&#xff0c;国家对此提出“发展海洋经济&#xff0c;保护海洋生态环境&#xff0c;加快建设海洋强国”的明确要求。   …...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...