【JMX】JAVA监控的基石

目录

1.概述

2.MBean

2.1.Standard MBean

2.2.Dynamic MBean

2.3.Model Bean

2.4.Dynamic MBean和Model Bean的区别

2.5.MXBean

2.6.Open Bean

3.控制台


1.概述

什么是JMX,首先来看一段对话:

Java Management Extensions(JMX)是一种Java标准,用于管理和监控Java应用程序,特别是分布式系统。它提供了一种标准化的方式来管理应用程序的各种方面,包括性能监控、配置更改、事件通知等。目前JMX最常用的就是用来做JAVA程序的监控,市面上常见的Java 监控框架基本都是基于JMX来实现的。

JMX分为三部分:

  1. MBean:MBean是用来提供功能的,MBean是管理对象的标准接口,通过MBean可以获取和操作应用程序的各种属性和操作。Java提供了几种类型的MBean,包括标准MBean、动态MBean、模型MBean等,每种类型适用于不同的场景。

  2. MBean服务器:MBean服务器是用来管理MBean的,它是一个注册表,用于注册和管理MBean。应用程序通过MBean服务器暴露MBean,并且其他应用程序或工具可以连接到MBean服务器以检索和操作这些MBean。

  3. JMX代理:JMX代理是用来访问MBean服务器的,可以理解为CS架构中的client端,支持多种访问方式。JMX代理是一个位于应用程序和MBean服务器之间的中间层,用于管理远程应用程序。它允许远程管理工具连接到远程应用程序的MBean服务器,并执行各种管理操作,如监控、配置和诊断。

img

JMX标准的实现通常由Java虚拟机(JVM)提供支持。Java虚拟机会实现JMX标准,以便应用程序可以利用JMX的功能。JVM会提供一个MBean服务器,应用程序可以将MBean注册到该服务器中,使其可供其他应用程序或工具访问和操作。

Java虚拟机通过提供标准的MBean服务器和相关的API,为应用程序提供了一种标准化的方式来管理和监控应用程序的各个方面。这种标准化使得开发人员可以使用相同的接口和工具来管理不同的Java应用程序,从而提高了管理的效率和一致性。

2.MBean

MBean服务器由于是JVM实现的,所以对我们应用开发者来说,最核心的其实就是MBean了,因为MBean是用来实现功能的。JMX标准中将MBean分为以下几种:

  1. Standard MBean(标准 MBean):它是最简单的一种 MBean 类型。一个标准 MBean 由一个 Java 接口和一个对应的实现类组成。接口中定义了 MBean 的属性和操作,实现类则提供了对应的实现。标准 MBean 的命名约定为 YourInterfaceNameMBean

  2. Dynamic MBean(动态 MBean):与标准 MBean 不同,动态 MBean 可以在运行时动态地确定其属性和操作。动态 MBean 的属性和操作是在运行时通过方法调用来确定的,因此可以根据需要进行动态修改。

  3. Model MBean(模型 MBean):模型 MBean 是一种特殊的 MBean,它通过描述符来描述其管理接口,可以在运行时动态地配置其属性和操作。模型 MBean 可以通过 XML 或者通过程序动态地加载描述符。

  4. MXBean:MXBean 是一种专门用于 JMX 的 MBean 类型。它定义了一种简单的 Java 接口和实现约定,用于描述 MBean 的属性和操作,同时这些接口和实现类遵循 Java Bean 的命名约定。MXBean 在 JMX 中用于管理特定类型的对象,例如内存使用情况、线程信息等。

  5. Open MBean:开放 MBean 是一种通用的 MBean 类型,它可以包含各种类型的属性和操作。开放 MBean 不限制其属性和操作的类型,因此可以包含任意类型的数据。

2.1.Standard MBean

所谓的Standard MBean,就是说按照JMX的命名规范来定义接口然后注册到MBean Server中,MBean就能被JMX的client端访问到。具体该MBean提供了什么功能,在这个自定义的MBean中去定义属性和方法仔细实现即可。

代码示例:

// 定义一个接口,命名约定为 YourInterfaceNameMBean
public interface HelloMBean {String getName();void setName(String name);void sayHello();
}
​
// 实现上述接口的类
public class Hello implements HelloMBean {private String name;
​@Overridepublic String getName() {return name;}
​@Overridepublic void setName(String name) {this.name = name;}
​@Overridepublic void sayHello() {System.out.println("Hello, " + name + "!");}
}
​
// 主程序
public class Main {public static void main(String[] args) throws Exception {// 创建标准 MBean 实例HelloMBean helloMBean = new Hello();// 创建 MBeanServerMBeanServer mbs = ManagementFactory.getPlatformMBeanServer();// 创建 ObjectName,用于标识 MBeanObjectName name = new ObjectName("com.example:type=Hello");// 注册 MBean 到 MBeanServermbs.registerMBean(helloMBean, name);// 等待一段时间,使得可以通过 JConsole 或者其他 JMX 客户端来操作 MBeanThread.sleep(Long.MAX_VALUE);}
}

2.2.Dynamic MBean

动态 MBean 是 Java Management Extensions (JMX) 中的一种特殊类型的 MBean,它与标准 MBean 不同之处在于,动态 MBean 允许在运行时动态地确定其属性和操作,这使得动态 MBean 能够在运行时根据需要动态地调,而不是在编译时就确定了。

说人话就是很方便动态的去修改Dynamic MBean的属性,这非常适合拿来做一些动态的功能,比如:

  • 动态配置管理,从外部去加载配置文件,实现配置的动态变化。

  • 动态监控,从外部去获取监控信息,比如实时的CPU、内存的信息,实现对系统的动态监控。

动态 MBean 的核心是实现 DynamicMBean 接口,该接口定义了一组方法,用于动态地获取和设置 MBean 的属性,执行 MBean 的操作,以及获取 MBean 的元数据信息。以下是 DynamicMBean 接口的几个核心方法:

  • getAttribute(String attribute):根据属性名获取属性值。

  • setAttribute(Attribute attribute):设置指定属性的值。

  • getAttributes(String[] attributes):批量获取属性值。

  • setAttributes(AttributeList attributes):批量设置属性值。

  • invoke(String actionName, Object[] params, String[] signature):执行指定的操作。

  • getMBeanInfo():获取 MBean 的元数据信息,包括属性、操作和描述信息。

代码示例:

import javax.management.*;
import java.lang.management.ManagementFactory;
​
public class DynamicHello implements DynamicMBean {private String name;
​@Overridepublic Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {if (attribute.equals("Name")) {return name;} else {throw new AttributeNotFoundException("Attribute '" + attribute + "' not found");}}
​@Overridepublic void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException {if (attribute.getName().equals("Name")) {name = (String) attribute.getValue();} else {throw new AttributeNotFoundException("Attribute '" + attribute.getName() + "' not found");}}
​@Overridepublic AttributeList getAttributes(String[] attributes) {AttributeList attrs = new AttributeList();for (String attr : attributes) {try {Object value = getAttribute(attr);attrs.add(new Attribute(attr, value));} catch (Exception e) {// Ignore if attribute not found}}return attrs;}
​@Overridepublic AttributeList setAttributes(AttributeList attributes) {AttributeList responseAttrs = new AttributeList();for (Attribute attr : attributes.asList()) {try {setAttribute(attr);responseAttrs.add(new Attribute(attr.getName(), getAttribute(attr.getName())));} catch (Exception e) {// Ignore if attribute not found or set failed}}return responseAttrs;}
​@Overridepublic Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException, ReflectionException {if (actionName.equals("sayHello")) {return "Hello, " + name + "!";} else {throw new UnsupportedOperationException("Operation '" + actionName + "' not supported");}}
​@Overridepublic MBeanInfo getMBeanInfo() {MBeanAttributeInfo[] attributes = new MBeanAttributeInfo[]{new MBeanAttributeInfo("Name", "java.lang.String", "Name of the person", true, true, false)};
​MBeanOperationInfo[] operations = new MBeanOperationInfo[]{new MBeanOperationInfo("sayHello", "Say hello to the person", null, "java.lang.String", MBeanOperationInfo.ACTION)};
​return new MBeanInfo(this.getClass().getName(), "Dynamic Hello MBean", attributes, null, operations, null);}
​public static void main(String[] args) throws Exception {DynamicHello dynamicHello = new DynamicHello();MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();ObjectName name = new ObjectName("com.example:type=DynamicHello");mbs.registerMBean(dynamicHello, name);Thread.sleep(Long.MAX_VALUE);}
}

在这个示例中,我们实现了 DynamicMBean 接口,并重写了它的方法来提供 MBean 的属性和操作。动态 MBean 允许在运行时确定其属性和操作,因此我们需要在实现中动态地处理属性的获取、设置和操作的调用。

getMBeanInfo() 方法中,我们定义了 MBean 的元数据信息,包括属性、操作和描述信息。在 main() 方法中,我们创建了 DynamicHello 的实例,并将其注册到 MBeanServer 中。然后通过 Thread.sleep(Long.MAX_VALUE) 使程序保持运行,以便通过 JConsole 或其他 JMX 客户端来操作该动态 MBean。

2.3.Model Bean

Model MBean 的核心是实现 ModelMBean 接口,该接口继承自 DynamicMBean 接口,因此具有动态 MBean 的所有特性,同时还添加了一些额外的方法用于管理描述符。以下是 ModelMBean 接口的一些重要方法:

  • setModelMBeanInfo(ModelMBeanInfo mbi):设置 Model MBean 的元数据信息,包括属性、操作和描述符。

  • setManagedResource(Object mr, String mr_type):指定 Model MBean 管理的资源对象及其类型。

  • sendNotification(Notification ntfyObj):发送通知给注册的监听器。

  • setAttribute(Attribute attribute)getAttribute(String attribute):获取和设置属性,这些属性可以通过描述符来配置。

代码示例:

import javax.management.*;
import javax.management.modelmbean.*;
import java.lang.management.ManagementFactory;
​
public class SimpleModelMBeanExample {public static void main(String[] args) throws Exception {// 创建 ModelMBeanInfo 对象ModelMBeanInfo modelMBeanInfo = createModelMBeanInfo();
​// 创建 ModelMBean 实例ModelMBean modelMBean = createModelMBean(modelMBeanInfo);
​// 创建 MBeanServerMBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
​// 创建 ObjectName,用于标识 MBeanObjectName name = new ObjectName("com.example:type=SimpleModelMBean");
​// 注册 ModelMBean 到 MBeanServermbs.registerMBean(modelMBean, name);
​// 等待一段时间,使得可以通过 JConsole 或者其他 JMX 客户端来操作 MBeanThread.sleep(Long.MAX_VALUE);}
​private static ModelMBeanInfo createModelMBeanInfo() throws Exception {// 创建属性描述符Descriptor nameDesc = new DescriptorSupport();nameDesc.setField("name", "Name");nameDesc.setField("descriptorType", "attribute");
​// 创建操作描述符Descriptor sayHelloDesc = new DescriptorSupport();sayHelloDesc.setField("name", "sayHello");sayHelloDesc.setField("descriptorType", "operation");
​// 创建属性列表MBeanAttributeInfo[] attributes = new MBeanAttributeInfo[]{new MBeanAttributeInfo("Name", "java.lang.String", "Name of the person", true, true, false, nameDesc)};
​// 创建操作列表MBeanOperationInfo[] operations = new MBeanOperationInfo[]{new MBeanOperationInfo("sayHello", "Say hello to the person", null, "java.lang.String", MBeanOperationInfo.ACTION, sayHelloDesc)};
​// 创建 ModelMBeanInfoModelMBeanInfo modelMBeanInfo = new ModelMBeanInfoSupport(SimpleModelMBeanExample.class.getName(),"Simple Model MBean Example",attributes,null,operations,null);
​return modelMBeanInfo;}
​private static ModelMBean createModelMBean(ModelMBeanInfo modelMBeanInfo) throws Exception {// 创建 ModelMBean 实例RequiredModelMBean modelMBean = new RequiredModelMBean();modelMBean.setModelMBeanInfo(modelMBeanInfo);
​// 创建 MBean 实例ObjectName name = new ObjectName("com.example:type=SimpleModelMBean");SimpleModelMBean example = new SimpleModelMBean();
​// 设置 MBean 实例modelMBean.setManagedResource(example, "ObjectReference");
​return modelMBean;}
}

在这个示例中,我们首先创建了一个 ModelMBeanInfo 对象,该对象描述了 Model MBean 的元数据信息,包括属性和操作。然后,我们创建了一个 ModelMBean 实例,并将 ModelMBeanInfo 设置到该实例中。接着,我们创建了一个 ObjectName 对象,用于标识 MBean,然后将 ModelMBean 实例注册到了 MBeanServer 中。

同时,我们还定义了一个 SimpleModelMBean 类,该类实现了 Model MBean 管理的资源对象。在这个类中,我们可以定义属性和操作的具体实现逻辑。

2.4.Dynamic MBean和Model Bean的区别

其实Model Bean本来就是继承自Dynamic MBean的,所以后者有的特点,前者也有,其二者本质的区别在于使用场景上:

  1. 动态性质

    • Dynamic MBean:Dynamic MBean 的设计理念是允许在运行时动态地确定其属性和操作。它适用于那些在编译时无法确定其管理接口的场景,例如,那些需要根据外部配置文件或运行时状态来确定其管理接口的应用程序。

    • Model MBean:Model MBean 的设计理念是通过描述符来描述其管理接口,使得可以在运行时动态地加载和配置 MBean 的属性和操作。它适用于需要动态加载和配置管理接口的场景,例如,根据不同的环境或条件来动态地调整管理接口。

  2. 自描述性

    • Dynamic MBean:Dynamic MBean 不提供自描述性,开发人员需要手动实现属性和操作的获取和设置逻辑。它主要关注于动态性和灵活性,适用于那些需要在运行时动态确定管理接口的场景。

    • Model MBean:Model MBean 提供了详细的元数据信息,包括属性和操作的描述信息,使得管理客户端可以动态地了解 MBean 的结构和功能。它适用于那些需要自描述性和灵活性的场景,例如,需要通过管理客户端来动态地了解和操作 MBean 的情况。

  3. 适应性

    • Dynamic MBean:Dynamic MBean 具有较高的适应性,可以根据外部条件或运行时状态动态地调整其管理接口。它适用于那些需要根据外部条件或运行时状态来动态调整管理接口的场景。

    • Model MBean:Model MBean 具有较高的适应性,可以根据不同的环境或条件动态地调整管理接口。它适用于那些需要根据不同的部署环境或运行时条件来动态地配置 MBean 的属性和操作的场景。

2.5.MXBean

在 Java 中,一切都被视为对象,而 JMX 则提供了一种标准化的方式来监控和管理 Java 程序的运行时状态、性能指标以及运行环境。而MXBean其实就是专门用于管理和监控这其中一些标准化类型的对象的。什么叫标准化的类型对象?其实就是一些定量的指标,例如内存使用情况、线程信息、操作系统属性等。这些MBean是拿来即用的。

Java 平台中有一些预定义的 MXBean,例如 MemoryMXBeanThreadMXBeanOperatingSystemMXBean 等,用于管理和监控 JVM 的内存、线程、操作系统属性等。

代码示例:

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;
​
public class MXBeanExample {public static void main(String[] args) {// 获取 MemoryMXBean 实例MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
​// 获取堆内存使用情况MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();System.out.println("Heap Memory Usage:");System.out.println("    Init: " + heapMemoryUsage.getInit() / (1024 * 1024) + " MB");System.out.println("    Used: " + heapMemoryUsage.getUsed() / (1024 * 1024) + " MB");System.out.println("    Committed: " + heapMemoryUsage.getCommitted() / (1024 * 1024) + " MB");System.out.println("    Max: " + heapMemoryUsage.getMax() / (1024 * 1024) + " MB");
​// 获取非堆内存使用情况MemoryUsage nonHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage();System.out.println("Non-Heap Memory Usage:");System.out.println("    Init: " + nonHeapMemoryUsage.getInit() / (1024 * 1024) + " MB");System.out.println("    Used: " + nonHeapMemoryUsage.getUsed() / (1024 * 1024) + " MB");System.out.println("    Committed: " + nonHeapMemoryUsage.getCommitted() / (1024 * 1024) + " MB");System.out.println("    Max: " + nonHeapMemoryUsage.getMax() / (1024 * 1024) + " MB");}
}

可以自定义MXBean吗?当然可以。

自定义 MXBean 主要包括两个步骤:

  1. 定义接口:首先,需要定义一个 Java 接口来描述 MXBean 的管理接口。这个接口中定义了一组属性和操作,用于描述被管理的对象的状态和行为。

  2. 实现类:然后,需要编写一个实现类来实现定义的接口。在实现类中,需要提供属性和操作的具体实现逻辑,以及可能需要的管理逻辑。

代码示例:

// 定义 MXBean 接口
public interface MyMXBean {// 属性:名称String getName();void setName(String name);// 操作:打印消息void printMessage(String message);
}
​
// 实现类
public class MyMXBeanImpl implements MyMXBean {private String name;// 实现属性的 getter 和 setter 方法@Overridepublic String getName() {return name;}@Overridepublic void setName(String name) {this.name = name;}// 实现操作的方法@Overridepublic void printMessage(String message) {System.out.println(message);}
}
​
// 在管理应用程序中注册和使用自定义的 MXBean
public class MyMXBeanRegistration {public static void main(String[] args) throws Exception {// 创建 MXBean 实例MyMXBean mxBean = new MyMXBeanImpl();// 注册 MXBean 到 MBeanServerMBeanServer mbs = ManagementFactory.getPlatformMBeanServer();ObjectName name = new ObjectName("com.example:type=MyMXBean");mbs.registerMBean(mxBean, name);// 等待一段时间,使得可以通过 JConsole 或者其他 JMX 客户端来操作 MXBeanThread.sleep(Long.MAX_VALUE);}
}

在这个示例中,我们定义了一个名为 MyMXBean 的接口,包含了一个属性 name 和一个操作 printMessage。然后,我们编写了一个实现类 MyMXBeanImpl,实现了这个接口,并提供了属性和操作的具体实现逻辑。最后,我们在管理应用程序中注册和使用了这个自定义的 MXBean。

2.6.Open Bean

与传统的 Standard MBean 和 Dynamic MBean 不同,Open MBean 不需要预先定义接口,而是使用开放式的数据类型和操作来描述 MBean 的管理接口,使得可以更灵活地适应各种场景和需求。

代码示例:

import javax.management.*;
import javax.management.openmbean.*;
​
public class OpenMBeanExample {public static void main(String[] args) throws Exception {// 创建 OpenTypeOpenType<String> stringType = SimpleType.STRING;OpenType<Integer> integerType = SimpleType.INTEGER;
​// 创建 OpenMBeanAttributeInfoOpenMBeanAttributeInfoSupport nameAttrInfo = new OpenMBeanAttributeInfoSupport("Name","Name of the person",stringType,true,false,false);OpenMBeanAttributeInfoSupport ageAttrInfo = new OpenMBeanAttributeInfoSupport("Age","Age of the person",integerType,true,false,false);
​// 创建 OpenMBeanOperationInfoOpenMBeanParameterInfo[] params = new OpenMBeanParameterInfo[]{};OpenMBeanOperationInfoSupport sayHelloOpInfo = new OpenMBeanOperationInfoSupport("sayHello","Say hello to the person",params,stringType,OpenMBeanOperationInfo.ACTION);
​// 创建 OpenMBeanInfoOpenMBeanInfoSupport mbeanInfo = new OpenMBeanInfoSupport(SimpleOpenMBean.class.getName(),"Simple Open MBean Example",new OpenMBeanAttributeInfo[]{nameAttrInfo, ageAttrInfo},null,new OpenMBeanOperationInfo[]{sayHelloOpInfo},null);
​// 创建 OpenMBean 实例SimpleOpenMBean mbean = new SimpleOpenMBean("John", 30);
​// 创建 MBeanServerMBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
​// 创建 ObjectName,用于标识 MBeanObjectName name = new ObjectName("com.example:type=SimpleOpenMBean");
​// 注册 OpenMBean 到 MBeanServermbs.registerMBean(mbean, name);
​// 等待一段时间,使得可以通过 JConsole 或者其他 JMX 客户端来操作 MBeanThread.sleep(Long.MAX_VALUE);}
}
​
// 实现 OpenMBean
public class SimpleOpenMBean implements OpenMBean {private String name;private int age;
​public SimpleOpenMBean(String name, int age) {this.name = name;this.age = age;}
​@Overridepublic Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {if (attribute.equals("Name")) {return name;} else if (attribute.equals("Age")) {return age;} else {throw new AttributeNotFoundException("Attribute " + attribute + " not found");}}
​@Overridepublic void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException {throw new UnsupportedOperationException("setAttribute not supported");}
​@Overridepublic Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException, ReflectionException {if (actionName.equals("sayHello")) {return "Hello, " + name + "!";} else {throw new UnsupportedOperationException("Operation " + actionName + " not supported");}}
​@Overridepublic MBeanInfo getMBeanInfo() {// 实现 OpenMBean 接口的 getMBeanInfo 方法,返回 MBean 的元数据信息return null;}
}

3.控制台

JDK自带了一个JMX的控制台JConsole,启动后选择进程,就能看到相应程序中的MBean。

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

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

相关文章

四.Linux实用操作 12-14.环境变量文件的上传和下载压缩和解压

目录 四.Linux实用操作 12.环境变量 环境变量 环境变量--PATH $ 符号 自行设置环境变量 自定义环境变量PATH 总结 四.Linux实用操作 13.文件的上传和下载 上传&#xff0c;下载 rz&#xff0c;sz命令 四.Linux实用操作 14.压缩和解压 压缩格式 tar命令 tar命令压缩…

Java核心设计模式:代理设计模式

一、生活中常见的代理案例 房地产中介&#xff1a;客户手里没有房源信息&#xff0c;找一个中介帮忙商品代购&#xff1a;代理者一般有好的资源渠道&#xff0c;降低购物成本&#xff08;如海外代购&#xff0c;自己不用为了买东西出国&#xff09; 二、为什么要使用代理 对…

2024最新版Sublime Text 4安装使用指南

2024最新版Sublime Text 4安装使用指南 Installation and Usage Guide to the Latest Sublime Text 4 in 2024 By JacksonML 0. Sublime Text是什么&#xff1f; Sublime Text 由自定义组件构建&#xff0c;支持Python, Java, C/C等多种编程语言&#xff0c;并为用户提供无与…

第74讲Breadcrumb 面包屑实现

Breadcrumb 面包屑实现 为了实现二级路由&#xff0c;我们搞成搞个子路由&#xff0c;对于二级菜单 const routes [{path: /,name: 首页,component: () > import(../views/layout),redirect:/home,children:[{path: /home,name: 首页,component: () > import(../views…

Redis篇之过期淘汰策略

一、数据的过期策略 1.什么是过期策略 Redis对数据设置数据的有效时间&#xff0c;数据过期以后&#xff0c;就需要将数据从内存中删除掉。可以按照不同的规则进行删除&#xff0c;这种删除规则就被称之为数据的删除策略&#xff08;数据过期策略&#xff09;。 2.过期策略-惰…

Peter算法小课堂—单调队列

祝大家新年快乐&#xff01; 今天这一次有点简单。 单调队列有两个要点&#xff0c;一个是单调&#xff0c;另一个就是我们的队列。 听到队列&#xff0c;我相信大家一定会想到它的好朋友BFS吧。但是……今天……可……没……那么……简单哦。 西佳佳偶像天团1 题目描述 …

MySQL-----DCL基础操作

▶ DCL简介 DCL英文全称是Data ControlLanguage(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权限。 DCL--管理用户 ▶ 查询用户 use mysql; select * from user; ▶ 创建用户 ▶ 语法 create user 用户名主机名 identified by 密码 设置为在任意主机上访问…

第67讲自定义icon实现

element-plus内置有一些常用的icon供我们使用&#xff0c;但是我们假如需要用自己的icon时候&#xff0c;我们可以搞一个icon自定义组件&#xff1b; 先把icons文件放到src下&#xff1b; 再新建一个SvgIcon组件&#xff1b; index.vue <template><svg class"…

机器人学、机器视觉与控制 上机笔记(第一版译文版 2.1章节)

机器人学、机器视觉与控制 上机笔记&#xff08;第一版译文版 2.1章节&#xff09; 1、前言2、本篇内容3、代码记录3.1、新建se23.2、生成坐标系3.3、将T1表示的变换绘制3.4、完整绘制代码3.5、获取点*在坐标系1下的表示3.6、相对坐标获取完整代码 4、结语 1、前言 工作需要&a…

Linux操作系统运维-Docker的基础知识梳理总结

Linux操作系统运维-Docker的基础知识梳理总结 docker用来解决不同开发人员软件调试时环境不统一的问题&#xff0c;保证了程序调试时运行环境的一致性。docker的设计理念便是一处镜像&#xff0c;处处运行&#xff0c;即通过产生用户软件&#xff0c;运行环境及其运行配置的统一…

ElasticSearch级查询Query DSL上

目录 ES高级查询Query DSL match_all 返回源数据_source 返回指定条数size 分页查询from&size 指定字段排序sort 术语级别查询 Term query术语查询 Terms Query多术语查询 exists query ids query range query范围查询 prefix query前缀查询 wildcard query通…

NAT——网络地址转换、NAPT

网络地址转换 NAT (Network Address Translation) 1994 年提出。 需要在专用网连接到互联网的路由器上安装 NAT 软件。 装有 NAT 软件的路由器叫做 NAT路由器&#xff0c;它至少有一个有效的外部全球 IP 地址。 所有使用本地地址的主机在和外界通信时&#xff0c;都要在 NA…

2024智慧城市新纪元:引领未来,重塑都市生活

随着科技的飞速发展和数字化转型的不断深入&#xff0c;2024年智慧城市领域迎来了全新的发展格局。 这一年&#xff0c;智慧城市的建设更加注重人性化、可持续性和创新性&#xff0c;为城市居民带来了前所未有的便捷与舒适。以下将重点关注智慧城市的几个核心内容&#xff0c;…

【Web】Spring rce CVE-2022-22965漏洞复现学习笔记

目录 原理概览 漏洞简述 Tomcat AccessLogValve 和 access_log 例题: 原理概览 spring框架在传参的时候会与对应实体类自动参数绑定&#xff0c;通过“.”还可以访问对应实体类的引用类型变量。使用getClass方法&#xff0c;通过反射机制最终获取tomcat的日志配置成员属性…

【十五】【C++】list的简单实现

list 的迭代器解引用探究 /*list的迭代器解引用探究*/ #if 1 #include <list> #include <vector> #include <iostream> #include <algorithm> using namespace std;class Date {private:int _year;int _month;int _day;public:Date(): _year(2024), _m…

继承

1.继承的作用 有些类与类之间存在特殊关系&#xff0c;下级别的成员除了拥有上一级别的共性&#xff0c;还有自己的特性。 这个时候我们就可以考虑利用继承技术&#xff0c;减少重复代码。 总结&#xff1a; 继承的好处&#xff1a;可以减少重复的代码 class A : public B;…

【深度学习】:实验6布置,图像自然语言描述生成(让计算机“看图说话”)

清华大学驭风计划 因为篇幅原因实验答案分开上传&#xff0c;深度学习专栏持续更新中&#xff0c;期待的小伙伴敬请关注 实验答案链接http://t.csdnimg.cn/bA48U 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 案例 6 &#xff1a;图像自…

VTK 三维场景的基本要素(相机) vtkCamera 相机的运动

相机的运动 当物体在处于静止位置时&#xff0c;相机可以在物体周围移动&#xff0c;摄取不同角度的图像 移动 移动分为相机的移动&#xff0c;和相机焦点的移动&#xff1b;移动改变了相机相对焦点的位置&#xff0c;离焦点更近或者更远&#xff1b;这样就会改变被渲染的物体…

阿里云游戏服务器一年费用多少?

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

深度解析Pandas聚合操作:案例演示、高级应用与实战技巧【第74篇—Pandas聚合】

深度解析Pandas聚合操作&#xff1a;案例演示、高级应用与实战技巧 在数据分析和处理领域&#xff0c;Pandas一直是Python中最受欢迎的库之一。它提供了丰富的数据结构和强大的功能&#xff0c;使得数据清洗、转换和分析变得更加高效。其中&#xff0c;Pandas的聚合操作在数据…