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

Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化

一、背景

线上程序连接mongos超时,mongo监控显示连接数已使用100%。

java程序报错信息:

org.mongodb.driver.connection: Closed connection [connectionId{localValue:1480}] to 192.168.10.16:3717 because there was a socket exception raised by this connectionorg.springframework.data.mongodb.UncategorizedMongoDbException: Prematurely reached end of stream; nested exception is com.mongodb.MongoSocketReadException: Prematurely reached end of streamat org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:138)at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2902)at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:2810)at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:2532)at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:2515)at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:876)

此时java应用程序的监控指标是,接口超时。

在这里插入图片描述

走过的弯路是,怀疑出现了慢查询,数据量剧增的同时没有索引。

所以,前期解决方向着重在优化Mongodb查询速度,增加索引。

但是,接口还是报错,超时;服务健康检测时,还是进入了不健康状态。

而进一步查看Mongodb数据库并没有很慢(超过500毫秒)的慢查询。

再查看Mongodb的内存、CPU、网络流量等指标本身也没有异常,唯独遗漏了连接数指标。

通过本文,希望读者也有同感,连接数指标很重要。

二、连接池配置

  • 最小连接数
  • 最大连接数
  • 连接的空闲时间
  • 连接的存活时间
  • 等待队列的长度
  • 等待可用的超时

参考链接:
mongo connection-string

因为不同语言的Mongo驱动实现不同,本文从java实现看一看其源码。

  • 阿里云数据库监控

在这里插入图片描述
在这里插入图片描述
从上图也可以看到,mongo数据库总共创建的连接数多达1189个,活跃的只有12个。

所以需要配置连接的空闲时间,及时释放连接,才不会导致有效请求无法连接mongodb。

而我们每个mongos能创建的连接数上限是2000,从监控信息可以看出,见下图:
在这里插入图片描述
当这里的连接使用率为100%时,程序后面想创建新的mongo连接,就会失败了。

既然知道这些指标重要,所以需要设置报警规则。

在这里插入图片描述

  • mongos配置及使用
    在这里插入图片描述
    购买的mongos,规格显示是最大3K,最后却只有2K。这是个大坑么?
    所以当我们的程序节点越来越多,只好购买多个mongos,截止目前,我们都已买了4个Mongos

在这里插入图片描述
在配置spring.data.mongodb.uri的值时,格式如下:

//指定连某个mongos
mongodb://{用户名}:{密码}@{域名信息}:3717/db_name//配置多个mongos
mongodb://{用户名}:{密码}@{域名信息1}:3717,{域名信息2}:3717,{域名信息3}:3717,{域名信息4}:3717/db_name

三、源码spring.boot.autoconfigure

1、入口类MongoAutoConfiguration.java

见jar包spring.boot.autoconfigure-2.2.4.RELEASE.jar

在这里插入图片描述
主要代码:

    @Bean@ConditionalOnMissingBean(type = { "com.mongodb.MongoClient", "com.mongodb.client.MongoClient" })public MongoClient mongo(MongoProperties properties, ObjectProvider<MongoClientOptions> options,Environment environment) {return new MongoClientFactory(properties, environment).createMongoClient(options.getIfAvailable());}

使用MongoClientFactory工厂模式创建并实例化类MongoClient。

下一步看一看工厂类MongoClientFactory的主要实现。

2、工厂类MongoClientFactory.java

在这里插入图片描述
读取MongoProperties配置以及MongoClientOptions配置,前者是通过application.yaml配置,后者是通过uri追加参数的方式。

下面看一看这两个配置类里都有哪些配置项,着重分析是否有针对连接池相关的。

3、MongoProperties.java

在这里插入图片描述

这里就不一一贴出来,发现并没有连接池相关的配置。

那么进一步查看com.mongodb.MongoClientOptions.java类有哪些属性。

4、MongoClientOptions.java

在这里插入图片描述
可以看到,连接池配置相关参数,是在这个类中。

那么,他们是在什么哪里赋值的呢?

它们跟Mongodb驱动有关,让我们跳到jar包momgo-java-driver-3.11.2.jar

四、源码momgo-java-driver

数据库驱动使用jdni技术,避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。

在这里插入图片描述
找到类com.mongodb.client.jndi.MongoClientFactory.java
在这里插入图片描述

1、工厂类MongoClientFactory.java

package com.mongodb.client.jndi;import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.MongoException;
import com.mongodb.diagnostics.logging.Logger;
import com.mongodb.diagnostics.logging.Loggers;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.RefAddr;
import javax.naming.Reference;
import javax.naming.spi.ObjectFactory;public class MongoClientFactory implements ObjectFactory {private static final Logger LOGGER = Loggers.getLogger("client.jndi");private static final String CONNECTION_STRING = "connectionString";public MongoClientFactory() {}public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception {String connectionString = null;if (environment.get("connectionString") instanceof String) {connectionString = (String)environment.get("connectionString");}if (connectionString == null || connectionString.isEmpty()) {LOGGER.debug(String.format("No '%s' property in environment.  Casting 'obj' to java.naming.Reference to look for a javax.naming.RefAddr with type equal to '%s'", "connectionString", "connectionString"));if (obj instanceof Reference) {Enumeration props = ((Reference)obj).getAll();while(props.hasMoreElements()) {RefAddr addr = (RefAddr)props.nextElement();if (addr != null && "connectionString".equals(addr.getType()) && addr.getContent() instanceof String) {connectionString = (String)addr.getContent();break;}}}}if (connectionString != null && !connectionString.isEmpty()) {MongoClientURI uri = new MongoClientURI(connectionString);return new MongoClient(uri);} else {throw new MongoException(String.format("Could not locate '%s' in either environment or obj", "connectionString"));}}
}

这里引入了一个关键类MongoClientURI.java

2、MongoClientURI.java

它有一个属性:ConnectionString对象,也就是说,MongoClientURI是用来解析数据库连接参数。

在这里插入图片描述
见关键代码: new ConnectionString(uri)

3、连接参数类com.mongodb.ConnectionString.java

该类的代码行数比较多,首要看的是其构造函数。(写出了从mongo.uri中解析数据库连接池参数的全过程)

spring:data:mongodb:uri: mongodb://192.168.10.16:3717/db_name?maxPoolSize=50
  • 构造函数

主要围绕着解析数据库连接相关参数来说明,其他的可以自行看源码。

在这里插入图片描述

  • 解析配置项 private Map<String, List> parseOptions(String optionsPart)

在这里插入图片描述

  • 赋值给当前类ConnectionString的属性
   private void translateOptions(Map<String, List<String>> optionsMap) {boolean tlsInsecureSet = false;boolean tlsAllowInvalidHostnamesSet = false;Iterator var4 = GENERAL_OPTIONS_KEYS.iterator();while(var4.hasNext()) {String key = (String)var4.next();String value = this.getLastValue(optionsMap, key);if (value != null) {if (key.equals("maxpoolsize")) {this.maxConnectionPoolSize = this.parseInteger(value, "maxpoolsize");} else if (key.equals("minpoolsize")) {this.minConnectionPoolSize = this.parseInteger(value, "minpoolsize");} else if (key.equals("maxidletimems")) {this.maxConnectionIdleTime = this.parseInteger(value, "maxidletimems");} else if (key.equals("maxlifetimems")) {this.maxConnectionLifeTime = this.parseInteger(value, "maxlifetimems");} else if (key.equals("waitqueuemultiple")) {this.threadsAllowedToBlockForConnectionMultiplier = this.parseInteger(value, "waitqueuemultiple");} else if (key.equals("waitqueuetimeoutms")) {this.maxWaitTime = this.parseInteger(value, "waitqueuetimeoutms");} else if (key.equals("connecttimeoutms")) {this.connectTimeout = this.parseInteger(value, "connecttimeoutms");} else if (key.equals("sockettimeoutms")) {this.socketTimeout = this.parseInteger(value, "sockettimeoutms");} else if (key.equals("tlsallowinvalidhostnames")) {this.sslInvalidHostnameAllowed = this.parseBoolean(value, "tlsAllowInvalidHostnames");tlsAllowInvalidHostnamesSet = true;} else if (key.equals("sslinvalidhostnameallowed")) {this.sslInvalidHostnameAllowed = this.parseBoolean(value, "sslinvalidhostnameallowed");tlsAllowInvalidHostnamesSet = true;} else if (key.equals("tlsinsecure")) {this.sslInvalidHostnameAllowed = this.parseBoolean(value, "tlsinsecure");tlsInsecureSet = true;} else if (key.equals("ssl")) {this.initializeSslEnabled("ssl", value);} else if (key.equals("tls")) {this.initializeSslEnabled("tls", value);} else if (key.equals("streamtype")) {this.streamType = value;LOGGER.warn("The streamType query parameter is deprecated and support for it will be removed in the next major release.");} else if (key.equals("replicaset")) {this.requiredReplicaSetName = value;} else if (key.equals("readconcernlevel")) {this.readConcern = new ReadConcern(ReadConcernLevel.fromString(value));} else if (key.equals("serverselectiontimeoutms")) {this.serverSelectionTimeout = this.parseInteger(value, "serverselectiontimeoutms");} else if (key.equals("localthresholdms")) {this.localThreshold = this.parseInteger(value, "localthresholdms");} else if (key.equals("heartbeatfrequencyms")) {this.heartbeatFrequency = this.parseInteger(value, "heartbeatfrequencyms");} else if (key.equals("appname")) {this.applicationName = value;} else if (key.equals("retrywrites")) {this.retryWrites = this.parseBoolean(value, "retrywrites");} else if (key.equals("retryreads")) {this.retryReads = this.parseBoolean(value, "retryreads");}}}if (tlsInsecureSet && tlsAllowInvalidHostnamesSet) {throw new IllegalArgumentException("tlsAllowInvalidHostnames or sslInvalidHostnameAllowed set along with tlsInsecure is not allowed");} else {this.writeConcern = this.createWriteConcern(optionsMap);this.readPreference = this.createReadPreference(optionsMap);this.compressorList = this.createCompressors(optionsMap);}}

这个方法揭示了mongodb驱动所支持的全部参数,而且它读取的key字符都是小写字母。

而我们在实际配置mongodb.uri连接参数的时候,一般都会采用驼峰格式。

这是因为在方法parseOptions()解析的时候,强制把所有的key都转换为小写了。
在这里插入图片描述

五、参数的默认值

至此,我们已知道了mongodb连接支持哪些参数,但是,当缺省未配置时,它们的默认值分别是多少呢?

这就得看另一个jar包mongodb-driver-core-3.11.2.jar, package为com.mongodb.connection下,有一个类ConnectionPoolSettings采用builder构造模式,可以看到,在构建对象的时候有进行默认赋值。

在这里插入图片描述
所以,如果你没有对属性maxConnectionIdleTimeMS进行设置,默认是0,不会释放空闲连接。

前面4个属性都可以不管,属性maxConnectionIdleTimeMS是一定要设置的。

否则不活跃的连接都一直占据着mongo的连接,随着服务节点增多,就会影响到所有依赖Mongo集群的服务。

体现出来的报错就是连接超时,你还以为是服务的qps过高导致服务挂了呢。

而mongodb的慢查询又没有,服务的qps很低的时候,仍旧报连接mongo超时错误。(真的是要怀疑人生)

使出重启大法,服务也无法健康。

如果你想对节点扩容,那就离曙光越来越远了。

文末,我这里给出Mongo连接池相关的参数:

spring:data:mongodb:uri: mongodb://192.168.10.16:3717/db_name?maxPoolSize=50&minPoolSize=10&maxIdleTimeMS=60000

六、总结

本文的内容比较长,既描述了阿里云对mongodb数据库的监控(着重是连接数指标),以及Mongos的使用及购买的坑,也从Java语言的 Mongo驱动程序作为切入点,分析并总结了支持哪些数据库连接池的配置项。

本案例是基于生产实际中遇到的一个棘手问题,希望可以帮助到你。

通过本文,让我们对连接数这个指标有更深的体会,它是一个很冷的指标,却非常致命。

说它致命,是说我们在遇到程序报错的时候,极容易陷入平常思维,以为是有慢查询,或者程序QPS过高导致程序挂了。

当你想去扩容程序的节点数,或者创建数据库索引的时候,服务不健康的问题并不能得到丝毫解决。

当没有找到问题的根本时,就像一个病人感冒去看医生,结果CT和心电图等一大推检查,只会起到拖延的作用。

相关文章:

Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化

一、背景 线上程序连接mongos超时&#xff0c;mongo监控显示连接数已使用100%。 java程序报错信息&#xff1a; org.mongodb.driver.connection: Closed connection [connectionId{localValue:1480}] to 192.168.10.16:3717 because there was a socket exception raised by…...

论文阅读--Evidence for the utility of quantum computing before fault tolerance

量子计算有望在某些问题上提供比传统计算更快的速度。然而&#xff0c;实现其全部潜力的最大障碍是这些系统固有的噪声。这一挑战被广泛接受的解决方案是实现容错量子电路&#xff0c;而这超出了当前处理器的能力范围。我们在此报告了在嘈杂的127 量子比特处理器上进行的实验&a…...

Maven的安装——给Idea配置Maven

一、什么是Maven? Maven是一个开源的项目管理工具&#xff0c;它主要用于Java项目的构建、依赖管理和项目生命周期管理。 二、准备环境 maven安装之前&#xff0c;我们要先安装jdk&#xff0c;确保你已经安装了jdk环境。可以通过【win】【r】打开任务管理器&#xff0c;输入…...

【虚拟机】VMWare的CentOS虚拟机断电或强制关机出现问题

VMware 虚拟机因为笔记本突然断电故障了&#xff0c;开机提示“Entering emergency mode. Exit the shell to continue.”&#xff0c;如下图所示&#xff1a; 解决方法&#xff1a;输入命令&#xff1a; xfs_repair -v -L /dev/dm-0 注&#xff1a;报 no such file or direct…...

如何在WPF中嵌入其它程序

在WPF中嵌入其它程序&#xff0c;这里提供两种方案 一、使用WindowsFormHost 使用步骤如下 1、添加WindowsFormsIntegration和System.Windows.Forms引用 2、在界面上放置WindowsFormHost和System.Windows.Forms.Panel 1 <Grid> 2 <WindowsFormsHost> 3…...

集合Queue、Deque、LinkedList、ArrayDeque、PriorityQueue详解

1、 Queue与Deque的区别 在研究java集合源码的时候&#xff0c;发现了一个很少用但是很有趣的点&#xff1a;Queue以及Deque&#xff1b; 平常在写leetcode经常用LinkedList向上转型Deque作为栈或者队列使用&#xff0c;但是一直都不知道Queue的作用&#xff0c;于是就直接官方…...

实战 | C#中使用YoloV8和OpenCvSharp实现目标检测 (步骤 + 源码)

导 读 本文主要介绍在C#中使用YoloV8实现目标检测,并给详细步骤和代码。 详细步骤 【1】环境和依赖项。 需先安装VS2022最新版,.NetFramework8.0,然后新建项目,nuget安装 YoloSharp,YoloSharp介绍: https://github.com/dme-compunet/YoloSharp 最新版6.0.1,本文…...

OpenCV基本图像处理操作(六)——直方图与模版匹配

直方图 cv2.calcHist(images,channels,mask,histSize,ranges) images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的…...

Hive离线数仓结构分析

Hive离线数仓结构 首先&#xff0c;在数据源部分&#xff0c;包括源业务库、用户日志、爬虫数据和系统日志&#xff0c;这些都是数据的源头。这些数据通过Sqoop、DataX或 Flume 工具进行提取和导入操作。这些工具负责将不同来源的数据传输到基于 Hive 的离线数据仓库中。 在离线…...

《macOS 开发环境配置与应用开发》

一、引言 macOS 作为一款强大而流行的操作系统&#xff0c;为开发者提供了丰富的开发机会和优秀的开发环境。无论是开发原生的 macOS 应用&#xff0c;还是进行跨平台开发&#xff0c;了解和掌握 macOS 开发环境的配置以及应用开发的方法至关重要。本文将详细介绍 macOS 开发环…...

DataGear 5.2.0 发布,数据可视化分析平台

DataGear 企业版 1.3.0 已发布&#xff0c;欢迎体验&#xff01; http://datagear.tech/pro/ DataGear 5.2.0 发布&#xff0c;图表插件支持定义依赖库、严重 BUG 修复、功能改进、安全增强&#xff0c;具体更新内容如下&#xff1a; 重构&#xff1a;各模块管理功能访问路径…...

Knife4j快速入门

1 概述 Knife4j是一个用于生成和展示API文档的工具&#xff0c;同时它还提供了在线调试的功能&#xff0c;下图是其工作界面。 了解&#xff1a; Knife4j有多个版本&#xff0c;最新版的Knife4j基于开源项目springdoc-openapi&#xff0c;这个开源项目的核心功能就是根据Sprin…...

pcap_set_buffer_size()函数

功能简介 pcap_set_buffer_size()函数主要用于设置数据包捕获的内核缓冲区大小。这个缓冲区是操作系统内核用于临时存储捕获到的数据包的区域。通过调整缓冲区大小&#xff0c;可以在一定程度上优化数据包捕获的性能&#xff0c;特别是在高流量网络环境或者需要长时间捕获数据包…...

Ubuntu24.04——软件包系统已损坏

如果你在使用 Ubuntu 时遇到“软件包系统已损坏”的问题&#xff0c;可以尝试以下步骤来修复它&#xff1a; 更新软件包列表&#xff1a; 打开终端&#xff0c;运行以下命令以更新软件包列表&#xff1a; sudo apt update修复损坏的软件包&#xff1a; 运行以下命令来修复损坏的…...

项目实战:Vue3开发一个购物车

这段HTML代码实现了一个简单的购物车实战小项目的前端页面&#xff0c;结合了Vue.js框架来实现数据响应式和交互逻辑。页面展示了购物车中的商品项&#xff0c;每个商品项有增减数量的按钮&#xff0c;并且能显示商品总数以及目前固定为0元的商品总价和总价计算。 【运用响应式…...

OpenOCD之J-Link下载

1.下载USB Dirver Tool.exe&#xff0c;选择J-Link dirver&#xff0c;替换成WinUSB驱动。&#xff08;⭐USB Dirver Tool工具可将J-Link从WinUSB驱动恢复为默认驱动⭐&#xff09; 下载方式 ①官方网址&#xff1a;https://visualgdb.com/UsbDriverTool/ ②笔者的CSDN链接&…...

C++中定义类型名的方法

什么是 C 中的类型别名和 using 声明&#xff1f; 类型别名与using都是为了提高代码的可读性。 有两种方法可以定义类型别名 一种是使用关键字typedef起别名使用别名声明来定义类型的别名&#xff0c;即使用using. typedef 关键字typedef作为声明语句中的基本数据类型的一…...

241124学习日志——[CSDIY] [ByteDance] 后端训练营 [14]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…...

丹摩|丹摩智算平台深度评测

1. 丹摩智算平台介绍 随着人工智能和大数据技术的快速发展&#xff0c;越来越多的智能计算平台涌现&#xff0c;为科研工作者和开发者提供高性能计算资源。丹摩智算平台作为其中的一员&#xff0c;定位于智能计算服务的提供者&#xff0c;支持从数据处理到模型训练的全流程操作…...

VSCode 快捷键

箭头函数 安装VSCODE插件用于在编辑器中生成ES6语法的JavaScript的代码段&#xff08;支持JavaScript和Typescript&#xff09;。 安装成功后输入an回车就可以了 (params) > {} 1、显示快捷键列表 快捷键&#xff1a;⌘ K S 可以通过上述按键显示vscode的快捷键列表&am…...

Java基础-Java多线程机制

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、引言 二、多线程的基本概念 1. 线程与进程 2. 多线程与并发 3. 多线程的优势 三、Java多线程的实…...

【创建型设计模式】单例模式

【创建型设计模式】单例模式 这篇博客接下来几篇都将阐述设计模式相关内容。 接下来的顺序大概是&#xff1a;单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。 一、什么是单例模式 单例模式是一种创建型设计模式&#xff0c;它保证一个类仅有一个实例&#…...

SpringBoot集成多个rabbitmq

1、pom文件 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><versio…...

JavaScript将至

JS是什么&#xff1f; 是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;实现人机交互效果 作用捏&#xff1f; 网页特效 (监听用户的一些行为让网页作出对应的反馈) 表单验证 (针对表单数据的合法性进行判断) 数据交互 (获取后台的数据, 渲染到前…...

Java中的线程池(如果想知道Java中有关线程池的知识,那么只看这一篇就足够了!)

前言&#xff1a;线程池是 Java 中用于高效管理并发任务的工具&#xff0c;通过复用线程、降低线程创建销毁的开销&#xff0c;提升系统性能与响应速度。它帮助开发者更好地控制线程生命周期和资源消耗&#xff0c;是高并发应用的重要组成部分。 ✨✨✨这里是秋刀鱼不做梦的BLO…...

Java 获取本机 IP 地址的方法

文章目录 一、使用 InetAddress.getLocalHost二、遍历网络接口获取 在 Java 编程中&#xff0c;若有本机的 IP 地址的需求&#xff0c;小编来展示一下方法&#xff1a; 一、使用 InetAddress.getLocalHost 一是最基本的获取本机 IP 地址的方式。 示例代码&#xff1a; impo…...

开源动态表单form-create-designer 扩展个性化配置的最佳实践教程

在开源低代码表单设计器 form-create-designer 的右侧配置面板里&#xff0c;field 映射规则为开发者提供了强大的工具去自定义和增强组件及表单配置的显示方式。通过这些规则&#xff0c;你可以简单而高效地调整配置项的展示&#xff0c;提升用户体验。 源码地址: Github | G…...

c语言数据结构与算法--简单实现线性表(顺序表+链表)的插入与删除

老规矩&#xff0c;点赞评论收藏关注&#xff01;&#xff01;&#xff01; 目录 线性表 其特点是&#xff1a; 算法实现&#xff1a; 运行结果展示 链表 插入元素&#xff1a; 删除元素&#xff1a; 算法实现 运行结果 线性表是由n个数据元素组成的有限序列&#xff…...

5、AI测试辅助-生成测试用例思维导图

AI测试辅助-生成测试用例思维导图 创建测试用例两种方式1、Plantuml思维导图版本 (不推荐&#xff09;2、Markdown思维导图版本&#xff08;推荐&#xff09; 创建测试用例两种方式 完整的测试用例通常需要包含以下的元素&#xff1a; 1、测试模块 2、测试标题 3、前置条件 4、…...

c ++零基础可视化——vector

c 零基础可视化——vector 初始化 vector<int> v0(5); // 0 0 0 0 0 vector<int> v1(5, 1); // 1 1 1 1 1 vector<int> v2{1, 2, 3} // 1 2 3 vector<int> v3(v1); // 1 1 1 1 1 vector<vector<int>> v4(2, vect…...

网络安全应急响应及其发展方向

计算机信息系统和网络已经成为社会重要的基础设施&#xff0c;而网络安全始终是笼罩在Internet天空的一片乌云&#xff0c;对社会的威胁也与日俱增。自1988年莫里斯蠕虫事件以来&#xff0c;网络安全事件逐年上升&#xff0c;所造成的损失越来越大。自从CERT/CC成立以来&#x…...

Linux应用编程(C语言编译过程)

目录 1. 举例 2.预处理 2.1 预处理命令 2.2 .i文件内容解读 3.编译 4.汇编 5.链接 5.1 链接方式 5.1.1 静态链接 5.1.2 动态链接 5.1.3 混合链接 1. 举例 Linux的C语言开发&#xff0c;一般选择GCC工具链进行编译&#xff0c;通过下面的例子来演示GCC如何使用&#…...

003 STM32基础、架构以及资料介绍——常识

注&#xff1a; 本笔记参考学习B站官方视频教程&#xff0c;免费公开交流&#xff0c;切莫商用。内容可能有误&#xff0c;具体以官方为准&#xff0c;也欢迎大家指出问题所在。 01什么是STM32&#xff08;宏观&#xff09; STM32属于一个微控制器&#xff0c;自带了各种常用通…...

输入三个整数x,y,z,请把这三个数由小到大输出。-多语言实现

目录 C 语言实现 Python 实现 Java 实现 Js 实现 题目&#xff1a;输入三个整数x,y,z&#xff0c;请把这三个数由小到大输出。 程序分析&#xff1a;我们想办法把最小的数放到x上&#xff0c;先将x与y进行比较&#xff0c;如果x>y则将x与y的值进行交换&#xff0c;然后…...

Java爬虫:获取商品详情的实践之旅

在当今这个信息爆炸的时代&#xff0c;数据的价值日益凸显。对于电商行业来说&#xff0c;商品详情的获取尤为重要&#xff0c;它不仅关系到产品的销售&#xff0c;还直接影响到用户体验。传统的人工获取方式耗时耗力&#xff0c;而自动化的爬虫技术则提供了一种高效解决方案。…...

vue 富文本图片如何拖拽

在Vue项目中实现富文本编辑器&#xff08;如vue-quill-editor&#xff09;的图片拖拽功能&#xff0c;需要结合Quill.js及其相关插件进行配置 安装必要的依赖包&#xff1a; 你需要安装vue-quill-editor作为富文本编辑器的基础组件。为了支持图片拖拽功能&#xff0c;你还需要…...

C#里怎么样实现自己的类满足for-each循环访问?

C#里怎么样实现自己的类满足for-each循环访问? 由于foreach语句使用起来比较方便,并且又简单,不像for循环那样需要写三个语句, 并且还有可能判断不对,导致少访问的情况。 在使用库里提供的容器时,都会有实现foreach的方式。 如果自己的类也实现这种方式,使用起来就比较…...

【Elasticsearch入门到落地】2、正向索引和倒排索引

接上篇《1、初识Elasticsearch》 上一篇我们学习了什么是Elasticsearch&#xff0c;以及Elastic stack(ELK)技术栈介绍。本篇我们来什么是正向索引和倒排索引&#xff0c;这是了解Elasticsearch底层架构的核心。 上一篇我们学习到&#xff0c;Elasticsearch的底层是由Lucene实…...

ODBC连接PostgreSQL数据库后,网卡DOWN后,客户端进程阻塞问题解决方法

问题现象&#xff1a;数据库客户端进程数据库连接成功后&#xff0c;再把跟数据库交互的网卡down掉&#xff0c;客户端进程就会阻塞&#xff0c;无法进行其他处理。该问题跟TCP keepalive机制有关。 可以在odbc.ini文件中增加相应的属性来解决&#xff0c;在odbc.ini 增加如下…...

Java Springboot河北任丘非遗传承宣传平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…...

SpringBoot整合MQTT利用EMQX完成消息的发布与接收+Python模拟硬件测试通信

教程说明 本教程主要内容为使用SpringBoot整合MQTT利用EMQX代理服务完成MQTT的消息发送与接收&#xff0c;然后用Python模拟硬件与SpringBoot应用进行了MQTT消息的通信&#xff0c;教程详细&#xff0c;并在最后讲解了开发中的注意事项&#xff0c;本教程适用于物联网领域、Ja…...

【数据结构】【线性表】栈的基本概念(附c语言源码)

栈的基本概念 讲基本概念还是回到数据结构的三要素&#xff1a;逻辑结构&#xff0c;物理结构和数据运算。 从逻辑结构来讲&#xff0c;栈的各个数据元素之间是通过是一对一的线性连接&#xff0c;因此栈也是属于线性表的一种从物理结构来说&#xff0c;栈可以是顺序存储和顺…...

【jvm】为什么java是半编译半解释型语言

目录 1. 编译过程2. 解释过程3. 即时编译&#xff08;JIT&#xff09;过程4. 半编译半解释型语言的特点 1. 编译过程 1.Java源代码首先会被编译成字节码&#xff08;Bytecode&#xff09;&#xff0c;这是一种与具体平台无关的中间代码。2.这一编译过程由Java编译器&#xff0…...

人工智能之机器学习5-回归算法2【培训机构学习笔记】

培训班ppt内容&#xff1a; 个人精进总结&#xff1a; 可解释方差 定义 可解释方差的回归评分函数是一种用于评估回归模型性能的指标&#xff0c;以下从其定义、计算公式、取值范围及意义、应用场景等方面进行详细介绍&#xff1a; 可解释方差&#xff08;Explained Varian…...

C#动态类型详解:应用场景与注意事项

C#中的动态类型&#xff08;dynamic&#xff09;是C# 4.0引入的一个关键字&#xff0c;它允许在编译时绕过类型检查&#xff0c;将类型确定推迟到运行时。这意味着&#xff0c;当使用dynamic类型时&#xff0c;编译器不会对调用的方法或访问的属性进行类型检查&#xff0c;而是…...

C语言笔记(自定义类型:结构体、枚举、联合体 )

前言 本文对自定义类型的结构体创建、使用、结构体的存储方式和对齐方式&#xff0c;枚举的定义、使用方式以及联合体的定义、使用和存储方式展开叙述&#xff0c;如有错误&#xff0c;请各位指正。 目录 前言 1 结构体 1.1 结构体的声明 1.2 结构体的自引用 1.3 结构体变…...

【Golang】——Gin 框架与数据库集成详解

文章目录 1. 引言2. 初始化项目2.1 创建 Gin 项目2.2 安装依赖 3. 数据库驱动安装与配置3.1 配置数据库3.2 连接数据库3.3 在主函数中初始化数据库 4. 定义数据模型4.1 创建用户模型4.2 自动迁移 5. 使用 GORM 进行 CRUD 操作5.1 创建用户5.2 获取用户列表5.3 更新用户信息5.4 …...

nature communications论文 解读

题目《Transfer learning with graph neural networks for improved molecular property prediction in the multi-fidelity setting》 这篇文章主要讨论了如何在多保真数据环境&#xff08;multi-fidelity setting&#xff09;下&#xff0c;利用图神经网络&#xff08;GNNs&…...

selinux及防火墙

selinux说明 SELinux 是 Security-Enhanced Linux 的缩写&#xff0c;意思是安全强化的 linux 。 SELinux 主要由美国国家安全局&#xff08; NSA &#xff09;开发&#xff0c;当初开发的目的是为了避免资源的误用。 httpd进程标签&#xff08;/usr/share/nginx/html &#…...

实验二 系统响应及系统稳定性

实验目的 &#xff08;1&#xff09;学会运用Matlab 求解离散时间系统的零状态响应&#xff1b; &#xff08;2&#xff09;学会运用Matlab 求解离散时间系统的单位取样响应&#xff1b; &#xff08;3&#xff09;学会运用Matlab 求解离散时间系统的卷积和。 实验原理及实…...