代码质量检查jacoco环境搭建


这里主要介绍集成和系统测试覆盖率环境搭建,并简单介绍各个工具。

关于单元测试的覆盖率监控(只需要修改ant或maven配置即可),下一篇说明


 

环境准备

需要环境 jdk1.8+centos 7+posgresql 9.6

工具下载

jacoco 0.8.2 https://www.eclemma.org/jacoco/

ant 1.10.5 https://ant.apache.org/bindownload.cgi

sonarQube 7.4 https://www.sonarqube.org/

sonarscanner3.2 https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

jenkins 2.147 https://jenkins.io/

1.官方文档

官方文档中内容很全,大部分都可以参考配置。

1.1.jacoco官方文档  https://www.eclemma.org/jacoco/trunk/doc/

1.2.sonarQube Analysis Parameters 参考文档https://docs.sonarqube.org/latest/analysis/analysis-parameters/

1.3.sonar-scanner 参考文档

https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

2.基础环境配置安装

2.0.服务配置说明

服务器A:jenkins、ant、sonar-scanner 以及 jacocoant.jar文件,分析覆盖率、生成报告、上传平台、持续集成

服务器B:单独搭建 sonarQube服务,sonarQube的平台,用户展示数据

服务器C:被监控应用程序 以及 jacocoagent.jar文件 ,jacocoagent代理监控覆盖率并提供服务给服务器A来获取


2.1.搭建步骤一-jenkins安装配置(rpm安装)

这里介绍简单的安装,有问题自行百度,下载rpm包,传到服务器,执行安装命令

rpm -ih jenkins-2.147.noarch.rpm

自动安装完成之后目录:

/usr/lib/jenkins/jenkins.war WAR包

/etc/sysconfig/jenkins 配置文件

/var/lib/jenkins/ 默认的JENKINS_HOME目录

/var/log/jenkins/jenkins.log Jenkins日志文件

相关命令:

service jenkins start/stop/restart/status 启动/停止/重启/查看状态

2.2.搭建步骤二-ant和sonar-scanner环境变量

解压ant和sonar-scanner到 jenkins 服务器上。
编辑/etc/profile和/etc/bashrc,末尾加入,并保存:

export ANT_HOME=/usr/apache-ant-1.10.5export PATH=$PATH:$ANT_HOME/binexport SONAR_SCANNER_HOME=/data/sonar-scanner-3.2.0.1227-linuxexport PATH=$PATH:$SONAR_SCANNER_HOME/bin

source /etc/profile和/etc/bashrc 使配置生效

[root@centos-7 ~]# source /etc/bashrc[root@centos-7 ~]# source /etc/profile

验证输入ant和 sonar-scanner 命令验证配置是否成功:

[root@centos-7 ~]# ant -versionApache Ant(TM) version 1.10.5 compiled on July 10 2018[root@centos-7 ~]# sonar-scanner -hINFO: INFO: usage: sonar-scanner [options]INFO: INFO: Options:INFO:  -D,--define <arg>     Define propertyINFO:  -h,--help             Display help informationINFO:  -v,--version          Display version informationINFO:  -X,--debug            Produce execution debug output

2.3.搭建步骤三-sonarQube安装配置。

2.3.1.基础配置

解压到服务器(和jenkins不需要同一台),

创建sonar用户(sonarQube不能在ROOT下运行 会报错):

 #创建用户 adduser sonarUser  #设置密码 pwdword  sonarUser #修改目录所有者 chown -R sonarUser:sonarUser sonarqube-7.4 #切换到 sonar用户 su sonarUser 执行命令: sonarqube-7.4/bin/linux-x86-64/sonar.sh start

浏览器输入:http://服务器IP:9000 能出现页面即可。

初始账号密码:admin admin

如不能访问请查看logs下日志,或者后面的常见问题

2.3.2.数据库配置

首先postgresql数据库中 创建sonar数据库 并指定数据库名即可。

数据库用户名密码 要写在最前面 否则会报错无法连接。

sonarqube-7.4/conf/sonar.properties

sonar.jdbc.username=postgressonar.jdbc.password=aorise
sonar.jdbc.url=jdbc:postgresql://10.16.4.57:5432/sonar?currentSchema=public
sonar.sorceEncoding=UTF-8sonar.login=adminsonar.password=admin

重启服务

sonarqube-7.4/bin/linux-x86-64/sonar.sh restart

稍微等待长一段时间,需要创建表,访问地址能进入。并且查看数据库有创建相关表。

初始账号密码:admin admin


2.3.3.services和开机自启动服务配置

系统基本service服务配置目录(此目录勿动,一般情况下只放系统核心基础服务配置,否存放应用注册类服务配置):

/etc/systemd/system

CentOS7的服务systemctl脚本存放在:/usr/lib/systemd/, 有系统(system)和用户(user)之分,需要开机不登陆就能运行的程序,存在系统服务里,即:/usr/lib/systemd/system目录下。

配置过程如下:

我们配置带自启动功能的service 所以目录为:/usr/lib/systemd/system

1、进入目录并编辑创建 sonarQube.service

cd /usr/lib/systemd/systemvim sonarQube.service

2、输入如下内容,并保存:

[Unit]Description=sonarQube#顾名思义,在网络加载完成后触发After=network.target
[Service]#指定执行用户信息User=sonarUserGroup=sonarUser#执行模式Type=forking#指定pid文件,只需要修改路径和 sonar.sh文件一致PIDFile=/data/sonarqube-7.4/bin/linux-x86-64/SonarQube.pid#指定start和stop方法的执行命令ExecStart=/data/sonarqube-7.4/bin/linux-x86-64/sonar.sh startExecStop=/data/sonarqube-7.4/bin/linux-x86-64/sonar.sh stop#允许使用临时空间,一般为truePrivateTmp=true
[Install]WantedBy=multi-user.target

 3、配置开机启动和相关命令​​​​​​​

#配置文件路径/usr/lib/systemd/system/sonarQube.service#开机启动或者取消开机启动systemctl  enable/disable sonarQube.service#使用systemctl和 service均可以启动停止服务service sonarQube start/stop/restartsystemctl  start/stop/restart sonarQube.service#原始的使用sh文件启动 依然可用/data/sonarqube-7.4/bin/linux-x86-64/sonar.sh start(stop status restart)

2.3.4.常见错误:

logs目录下查看日志

1、无法使用root用户启动:完成基础配置,创建基础用户并修改文件夹所有权。

2、报错部分文件没有权限:重新对目录执行 chown -R sonarUser:sonarUser sonarqube-7.4(有可能是 中途错误的使用root用户启动了服务,产生了临时文件权限是root。)

3、报错数据库连接不上:数据库配置错误,且数据库账号密码一定要写到url的前面。

4、如果配置的是mysql数据库,执行大项目的时候,执行过程正常但最后报告上传失败:修改mysql配置文件中的max_allowed_packet=50M(大小依据log显示的报告大小)。重启mysql

5、部分项目使用mysql把max_allowed_packet修改到足够大了,依然无法上传:这个问题还没解决 换到了postgresql 没这个问题

3.jacoco和ant

3.1.简介

jacoco用来监控覆盖率 结合ant完成 dump(生成exec数据文件) 和 report操作(生成报告)。

Java Agent 可以通过如下的JVM参数来启动:

-javaagent:[yourpath/]jacocoagent.jar=[opt1]=[val1],[opt2]=[val2]

其中:output=file/tcpserver/tcpclient

1,文件,当JVM退出时将执行数据写到本地

2,TCP Socket Server,以外部工具的形式连接JVM,通过socket获取执行数据。作为一个server服务器发布出去,可以从此处获取数据。

3,TCP Sockect Client,程序启动时Agent连接到TCP端点,通过request将执行数据输出。

结合官网中 Java Agent 相关参数说明,得到我们最终需要的命令如下:​​​​​​​

#分别指定使用tcpserver模式,指定端口(确保没有被占用)和ip地址(一般本地)-javaagent:/data/javaweb/jacocoagent.jar=output=tcpserver,port=8893,address=10.16.3.10

3.2.监控服务启动代理

1、将下载的jacoco解压,jacocoagent.jar传到需要监控覆盖率的应用服务器
2、在服务jvm启动参数中添加 (tomcat需要修改catalina.sh中的JAVA_OPTS参数)

-javaagent:/data/javaweb/jacocoagent.jar=output=tcpserver,port=8893,address=10.16.3.10

address 一般为本机地址,port为暴露的端口 后续使用。
注意,建议加载jvm参数的最前面,加载中级可能不起作用。如:​​​​​​​

#这个是有校的:java -javaagent:/data/javaweb/jacocoagent.jar=output=tcpserver,port=8893,address=10.16.3.10 -jar /data/javaweb/edu-teaching.jar --spring.profiles.active=test#这个是无效的:java  -jar /data/javaweb/edu-teaching.jar -javaagent:/data/javaweb/jacocoagent.jar=output=tcpserver,port=8893,address=10.16.3.10 --spring.profiles.active=test

3、启动应用服务器,如:

java -javaagent:/data/javaweb/jacocoagent.jar=output=tcpserver,port=8893,address=10.16.3.10 -jar /data/javaweb/edu-teaching.jar --spring.profiles.active=test

4、检查是否代理成功:
如下检查对应端口监听起来了,并且进程正常即可​​​​​​​

[root@edu-teaching-rel ~]# netstat -ano |grep 8893tcp6       0      0 10.16.4.40:8893         :::*                    LISTEN      off (0.00/0/0)[root@edu-teaching-rel ~]# ps -ef|grep jacocoroot      2006  1978  0 14:43 pts/0    00:00:00 grep --color=auto jacocoroot     30233     1  0 Nov23 ?        00:08:31 java -javaagent:/data/javaweb/jacocoagent.jar=output=tcpserver,port=8893,address=10.16.4.40 -jar /data/javaweb/edu-vehicle.jar --spring.profiles.active=test

3.3.ant配置和构建

进入ant安装的服务器
1、创建一个工作目录如:jacocowork,并把jacocoant.jar放入目录
2、进入目录 创建并编辑文件:build.xml
参考jacoco官方文档中的ant配置,
做如下配置,详情参考官方文档和下面的注解:​​​​​​​

<?xml version="1.0" ?><project name="QAWebPortal" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">  <!--远程tomcat服务的ip地址-->  <property name="server_ip" value="10.16.3.10"/>  <!--前面配置的远程tomcat服务打开的端口,要跟上面配置的一样-->  <property name="server_port" value="8893"/><!--构建路径build.xml文件的路径--> <property name="buildPath" value="."/>    <!--Jacoco的安装路径-->  <property name="jacocoantPath" value="${buildPath}/jacocoant.jar"/>  <!--最终生成.exec文件的路径,Jacoco就是根据这个文件生成最终的报告的-->  <property name="jacocoexecPath" value="${buildPath}/jacoco.exec"/>    <!--生成覆盖率报告的路径-->  <property name="reportfolderPath" value="${buildPath}/coverage_ant_task/report/"/>    <!--生成XML报告的名字-->  <property name="reportfolderXmlFile" value="xmlReport.xml"/>  <!--源代码路径-->  <property name="checkOrderSrcpath" value="${buildPath}/smart-city-vehicle/src/main/java" />  <!--.class文件路径-->  <property name="checkOrderClasspath" value="${buildPath}/smart-city-vehicle/build/classes" />  <!--让ant知道去哪儿找Jacoco-->  <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">      <classpath path="${jacocoantPath}" />  </taskdef>
  <!--dump任务:      根据前面配置的ip地址,和端口号,      访问目标tomcat服务,并生成.exec文件。-->  <target name="dump">      <jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/>  </target>
  <!--jacoco任务:      根据前面配置的源代码路径和.class文件路径,      根据dump后,生成的.exec文件,生成最终的html覆盖率报告。-->  <target name="report">      <delete dir="${reportfolderPath}" />      <mkdir dir="${reportfolderPath}" />      <jacoco:report>          <executiondata>              <file file="${jacocoexecPath}" />          </executiondata>          <structure name="JaCoCo Report">              <group name="Check qaportal related">                             <classfiles>                      <fileset dir="${checkOrderClasspath}" />                  </classfiles>                  <sourcefiles encoding="utf-8">                      <fileset dir="${checkOrderSrcpath}" />                  </sourcefiles>              </group>          </structure>      <!--生成htmlreport和xmlreport,自行选择需要的-->          <html destdir="${reportfolderPath}" encoding="utf-8" />               <html destfile="${reportfolderPath}/${reportfolderXmlFile}" encoding="utf-8" />         </jacoco:report>  </target></project>

3、进入目录,执行 ant dump 生成.exec文件数据文件
4、进入目录,执行 ant report 生成报告
5、进入报告目录,点击index.html即可打开


4.sonarQube和sonar-scanner

4.1.简介

sonarQube用于展示代码测试质量,以及覆盖率。

sonar-scanner 在本地扫描代码,覆盖率数据文件后上传到sonarQube中。

4.2.基础配置

1、把项目源码和class文件均拷贝到,工作目录

2、工作目录下,新增sonar-project.properties,并编辑,保存(下面涉及到相对目录的都是以工作目录为基础):

参考官方分析参数文档:

https://docs.sonarqube.org/latest/analysis/analysis-parameters/​​​​​​​

#sonarqube的地址sonar.host.url=http://10.16.3.26:9000# SonarQube 中唯一表示,must be unique in a given SonarQube instancesonar.projectKey=smart-city-vehicle-coverage# ui里面显示的项目名称,this is the name displayed in the SonarQube UIsonar.projectName= smart-city-vehicle-coverage#版本号sonar.projectVersion=1.1
#XML报告地址#sonar.coverage.jacoco.xmlReportPaths=report.xml#用户名密码,或者用token代替sonar.login=${SONAR_AUTH_TOKEN}#sonar.password=admin#语言sonar.language=java#源码位置sonar.sources=smart-city-vehicle/src/main/java#sonar.java.sources=src/main/java#class文件位置sonar.java.binaries=smart-city-vehicle/build/classes
#源码的编码sonar.sourceEncoding=UTF-8
#设置源码覆盖工具sonar.java.coveragePlugin=jacoco#设置源码覆盖数据sonar.jacoco.reportPaths=jacoco.exec

4.3.执行

1、执行ant dump 生成 .exec数据文件(不需要report,sonar只依赖数据文件,然后生成)
2、工作目录下执行sonar-scanner 既可以自动完成
3、进入并登陆sonarQube 网站即可看到项目数据


5.集成到jenkins

5.1.Jenkins环境准备

1、安装插件:JaCoCo plugin、Ant Plugin、SonarQube Scanner for Jenkins
2、系统管理-全局工具配置:配置ant信息如图:


3、系统管理-系统设置中配置:SonarQube servers:
token从SonarQube获取:个人头像-我的账号-安全-生成令牌


​​​​​​​

4、系统管理-全局工具配置:配置SonarQube Scanner信息如图:


5.2.配置项目

1、创建一个自由风格的项目

2、将需要监控项目的源码、class文件、jacocoant.jar放到此项目工作目录下

5.3.ant集成至jenkins

1、工作目录下,创建并编辑文件:build.xml:

和前面的XML不同,没有预定义各种参数的值,因为这些值从jenkins中注入更好操作。(参考下一步中Properties)​​​​​​​

<?xml version="1.0" ?><project name="QAWebPortal" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">  <!--让ant知道去哪儿找Jacoco-->  <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">      <classpath path="${jacocoantPath}" />  </taskdef>  <!--dump任务:      根据前面配置的ip地址,和端口号,      访问目标tomcat服务,并生成.exec文件。-->  <target name="dump">      <jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/>  </target>  <!--jacoco任务:      根据前面配置的源代码路径和.class文件路径,      根据dump后,生成的.exec文件,生成最终的html覆盖率报告。-->  <target name="report">      <delete dir="${reportfolderPath}" />      <mkdir dir="${reportfolderPath}" />      <jacoco:report>          <executiondata>              <file file="${jacocoexecPath}" />          </executiondata>          <structure name="JaCoCo Report">              <group name="Check qaportal related">                             <classfiles>                      <fileset dir="${checkOrderClasspath}" />                  </classfiles>                  <sourcefiles encoding="utf-8">                      <fileset dir="${checkOrderSrcpath}" />                  </sourcefiles>              </group>          </structure>          <html destdir="${reportfolderPath}" encoding="utf-8" />               <html destfile="${reportfolderPath}/${reportfolderXmlFile}" encoding="utf-8" />         </jacoco:report>  </target></project>

2、添加构建步骤:invoke ant
Version: 选择配置好的 ant版本
targets: dump
Build File: build.xml
Properties: 如下​​​​​​​

#远程jacocoagent服务启动后的地址server_ip=10.16.4.40#远程jacocoagent服务启动后的端口server_port=8893#jacocoant.jar的安装路径,可以为绝对和相对地址都可以jacocoantPath=jacocoant.jar#以下下所有地址建议都使用相对于WORCKSPACE的相对地址,因为后面的jenkins jacoco插件只支持相对路径。#最终生成.exec文件的路径,Jacoco就是根据这个文件生成最终的报告的jacocoexecPath=jacoco.exec#生成覆盖率报告的路径reportfolderPath=coverage_ant_task/reportreportfolderXmlFile=report.xml#源代码路径checkOrderSrcpath=smart-city-vehicle/src/main/java#class编译后文件路径checkOrderClasspath=smart-city-vehicle/build/classes

3、再次添加构建步骤:invoke ant (可以不要这一步)

Version: 选择配置好的 ant版本

targets: report

Build File: build.xml

Properties: 和上一部一样

4、保存执行立即构建,能执行成功即可(看日志成功)

5.4.集成jacoco

1、上一步基础上,新增构建后步骤record jacoco coverage report 如图:


​​​​​​​

 

2、 很简单的配置 exec 文件路径,class文件路径 源文件路径即可。
3、构建项目,可以看到下图效果:



 

4、点击编辑视图添加列jacoco branch coverage和jacoco line coverage,可以看到如下效果:


 


 

5.5 集成sonar

1、勾选构建环境-Prepare SonarQube Scanner environment(这个选项会把系统管理-系统设置中配置:SonarQube servers中设置的数据注入到以下环境变量):

SONAR_HOST_URL url地址SONAR_AUTH_TOKEN  token令牌SONAR_EXTRA_PROPS 输入的额外参数SONAR_MAVEN_GOAL - supplies the correct Maven goal based on the "Version of sonar-maven-plugin" specified for the SonarQube instance.

2、构建步骤中新增 execute sonarqube scanner
Task to run: 留空即可
JDK: 设置jdk 或者 inherit from job
Path to project properties: 留空
Analysis properties:​​​​​​​

#sonarqube的地址sonar.host.url=${SONAR_HOST_URL}# SonarQube 中唯一表示,must be unique in a given SonarQube instancesonar.projectKey=smart-city-vehicle-coverage# ui里面显示的项目名称,this is the name displayed in the SonarQube UIsonar.projectName= smart-city-vehicle-coverage#版本号sonar.projectVersion=1.1
#XML报告地址#sonar.coverage.jacoco.xmlReportPaths=report.xml#用户名密码,或者用token代替sonar.login=${SONAR_AUTH_TOKEN}#sonar.password=admin#语言sonar.language=java#源码位置sonar.sources=smart-city-vehicle/src/main/java#sonar.java.sources=src/main/java#class文件位置sonar.java.binaries=smart-city-vehicle/build/classes# Encoding of the source code. Default is default system encoding#源码的编码sonar.sourceEncoding=UTF-8
#Set jacoco Configuration#Code coverage toolsonar.java.coveragePlugin=jacoco#Path to the JaCoCo report file containing coverage data by unit tests. The path may be absolute or relative to the project base directorysonar.jacoco.reportPaths=jacoco.exec

3、构建项目,可以看到如下效果,显示sonarqube图标:


 

4、点击图标,跳转进入sonarqube 指定项目,并且显示代码质量和覆盖率信息,如图:


 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个“彩光”的自白:入室10万间的变革路

从0到10W 锐捷以太彩光的每一步 2021年 以太全光奠基 锐捷网络创新性提出了以太全光路线的代表性方案——极简以太全光解决方案1.0,在采用光纤作为传播介质的基础上,将交换机直接下沉至房间内。这一举措不仅简化了布线,新增业务只需在房间内灵活扩展,即可完成终端入网,而且通…

【C++】 类的6个默认成员函数

目录 1. 类的6个默认成员函数 一.构造函数 1.基本概念 2 特性 注意&#xff1a;C11 中针对内置类型成员不初始化的缺陷&#xff0c;又打了补丁&#xff0c; 3.构造函数详解 3.1构造函数体赋值 3.2 初始化列表 3.3 explicit关键字 二.析构函数 1 概念 2 特性 两个栈实…

NPDP|传统行业产品经理如何跨越鸿沟,从用户角度审视产品

随着科技的飞速发展和互联网的普及&#xff0c;产品经理的角色已经从单纯的产品规划者逐渐转变为全方位的用户体验设计者。对于传统行业的产品经理来说&#xff0c;这是一个挑战与机遇并存的时代。他们不仅要面对激烈的市场竞争&#xff0c;还要学会如何跨越与新兴科技行业之间…

C++ 搜索二叉树

目录 1.二叉搜索树概念 2. 实现二叉搜索树 2.1. 二叉搜索树的插入 2.2查找 2.3删除节点 3.二叉树的应用&#xff08;KV结构&#xff09; 1.二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为…

C# 排序的多种实现方式

排序是我们编程时的常用操作&#xff0c;实现方式也有很多种&#xff0c;本篇文章列举几种我常用的用法&#xff0c;希望对大家有用&#xff01; 01 数组排序 最常见的排序是对一个数组排序&#xff0c;比如&#xff1a; int[] aArray new int[8] { 18, 17, 21, 23, 11, 31…

当时这样说就好了的笔记

系列文章目录 当时这样说就好了的笔记 文章目录 系列文章目录一、 不用好口才&#xff0c;怎么谈都讨喜的“说话金律”1、 掌握对方爱聊什么是交谈热络的第一步2、 装笨让对方当主角&#xff0c;和谁都能聊不停3、 “讲道理”谁都怕&#xff0c;坚持己见最伤感情4、 懂“聆听附…

C#学习笔记12:Winform网页操作-CefSharp内嵌浏览器

今日学习使用Winform操作网页&#xff0c;先从从窗体内嵌一个浏览器开始吧&#xff1a; 文章提供测试代码讲解、测试效果图、整体测试工程下载 目录 CefSharp介绍与安装&#xff1a; 创建解决方案安装CefSharp&#xff1a; 控件放置&#xff1a; 整体代码贴出&#xff1a; 更改…

(ICLR,2024)GRAFT:通过地面远程对齐无需文本注释训练遥感图像的视觉语言模型

文章目录 相关资料摘要引言方法图像级VLMs像素级VLMs收集地面-卫星图像对用基础模型增强GRAFT VLMs 实验图像级理解像素级理解 相关资料 论文&#xff1a;Remote Sensing Vision-Language Foundation Models without Annotations via Ground Remote Alignment 项目地址&#x…

SOLIDWORKS PDM—用户的个性化设置

SOLIDWORKS 产品数据管理 (PDM) 解决方案可帮助您控制设计数据&#xff0c;并且从本质上改进您的团队就产品开发进行管理和协作的方式。使用 SOLIDWORKS PDM Professional&#xff0c;您的团队能够&#xff1a;1. 安全地存储和索引设计数据以实现快速检索&#xff1b;2. 打消关…

【数据结构陈越版笔记】第1章 概论

我最近准备以陈姥姥的数据结构教材为蓝本重新学一下数据结构&#xff0c;写一下读书笔记 第1章 概论 1.1 引子 概论中首先描述了&#xff0c;数据结构的定义没有具体的定义&#xff0c;初学者可以不用管这个定义的问题&#xff0c;但是我理解的和维基百科的说法是一样的“数…

GaussDB数据库SQL系列-复合查询

目录 一、前言 二、复合查询基础 三、实际应用示例 1、使用UNION合并查询结果 2、使用INTERSECT找出共同元素 3、使用EXCEPT排除特定结果 四、高级技巧 1、子查询实例 2、JOIN的应用 五、总结 一、前言 GaussDB是华为自主创新研发的分布式关系型数据库&#xff0c;具…

输出电流保护/限制方案分享

需求 对电源输出进行 过/限 流保护。 方案1 采样电流输出模拟电压 -> 电压比较器 -> 控制MOS 打开/关闭&#xff1b; 这个方案的问题是&#xff1a; 当过流MOS关断之后&#xff0c;电流采样的电压是0&#xff0c;会快速使使MOS重新打开&#xff0c;电路现象是好像没关…