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

Oracle 慢sql排查

Oracle慢sql排查步骤

1.1. 前言

Oracle 慢查询的排查方向包括以下几个方向 :

  • 基准测试 (吞吐量): 包括 Oracle 本身吞吐量和磁盘 I/O 吞吐量
  • 硬件分析 (资源情况): 包括查看服务器 CPU , 硬盘的使用情况
  • SQL分析:分析 SQL 中是否存在慢查询 , 是否命中索引
  • 配置优化: 分析是否可以通过环境配置提高性能

以上几个方面 , 基本上就能将问题定位了 , 通过问题再考虑解决的方法。

Oracle提供了多种工具来帮助追踪和优化慢查询,例如:

  1. SQL Tuning Advisor:自动生成SQL语句的优化建议。
  2. Automatic Workload Repository (AWR):收集数据库性能数据,帮助分析性能瓶颈。
  3. Oracle Enterprise Manager:提供图形化界面,帮助监控和管理数据库。

1.2. 排查步骤

1.2.1. 查询慢查询日志

区别于 Mysql 直接写到 log 中的日志 , Oracle 可以通过语句拉出慢查询的 SQL

select *from (select sa.SQL_TEXT "执行 SQL",sa.EXECUTIONS "执行次数",round(sa.ELAPSED_TIME / 1000000, 2) "总执行时间",round(sa.ELAPSED_TIME / 1000000 / sa.EXECUTIONS, 2) "平均执行时间",sa.COMMAND_TYPE,sa.PARSING_USER_ID "用户 ID",u.username "用户名",sa.HASH_VALUEfrom v$sqlarea saleft join all_users uon sa.PARSING_USER_ID = u.user_idwhere sa.EXECUTIONS > 0order by (sa.ELAPSED_TIME / sa.EXECUTIONS) desc)where rownum <= 50;select *from (select s.SQL_TEXT,s.EXECUTIONS "执行次数",s.PARSING_USER_ID "用户名",rank() over(order by EXECUTIONS desc) EXEC_RANKfrom v$sql sleft join all_users uon u.USER_ID = s.PARSING_USER_ID) twhere exec_rank <= 100;

结果解释 :

拿到平均执行时间后就可以明显的发现查询时间较长的 SQL , 但是这一类 SQL 不一定是慢查询 , 需要根据情况判断 , 如果出现很离谱的时间 , 就需要分析索引

1.2.2. Oracle 查询 SQL 语句执行的耗时
select a.sql_text SQL 语句, b.etime 执行耗时, c.user_id 用户 ID,c.SAMPLE_TIME 执行时间, c.INSTANCE_NUMBER 实例数, u.username 用户名, a.sql_id SQL 编号from dba_hist_sqltext a,(select sql_id, ELAPSED_TIME_DELTA / 1000000 as etimefrom dba_hist_sqlstatwhere ELAPSED_TIME_DELTA / 1000000 >= 1) b,dba_hist_active_sess_history c,dba_users uwhere a.sql_id = b.sql_idand u.username = 'SYNC_PLUS_1_20190109'and c.user_id = u.user_idand b.sql_id = c.sql_idorder by  SAMPLE_TIME desc,b.etime desc;
1.2.3. 定位系统里面哪些 SQL 脚本存在 TABLE ACCESS FULL (扫全表) 行为
select *from v$sql_plan vwhere v.operation = 'TABLE ACCESS'and v.OPTIONS = 'FULL'and v.OBJECT_OWNER='ORCL';
select s.SQL_TEXTfrom v$sqlarea swhere s.SQL_ID = '4dpd97jh2gzsd'and s.HASH_VALUE = '1613233933'and s.PLAN_HASH_VALUE = '3592287464';
或者select s.SQL_TEXT from v$sqlarea s where s.ADDRESS = '00000000A65D2318';
1.2.4. 查看索引情况

explain plan for
select * from t_records where t_bjhm='123456';


select * from table(dbms_xplan.display);

EXPLAIN PLAN 的输出通常包含以下字段:

  • Operation:表示 Oracle 执行查询时使用的操作类型(如表扫描、索引扫描、连接操作)。
  • Options:显示特定操作的选项(如表扫描是全表扫描还是索引扫描)。
  • Object Name:表示查询操作所涉及的对象(如表或索引)。
  • Cost:表示 Oracle 估算的该操作的相对成本,值越大表示该操作的成本越高。
  • Cardinality:估算的行数,表示该操作处理的行数。
  • Bytes:估算的字节数,表示该操作处理的字节数。
  • Time:Oracle 估计的完成该操作所需的时间。
  • Predicate Information:显示查询条件和过滤谓词,帮助理解优化器如何应用 WHERE 子句。

索引内容补充

从这里可以明显看到走了全表扫描 , 那么就需要根据情况加索引和校验

  • index unique scan : 索引唯一扫描 (主键索引)
  • index range scan : 索引范围扫描 (组合索引的情况)
  • index full scan : 全索引扫描
  • index fast full scan : 索引快速扫描, 扫描索引中的全部的数据块, 与全索引扫描的方式基本上类似。
    • 两者之间的明显的区别是, 索引快速扫描对查询的数据不进行排序, 数据返回的时候不是排序的。
1.2.5. 查看锁的竞争情况
Step 1 : 查看后台锁竞争

然后通过 SID 再去查找对应的 SQL , 找到对应的锁对象

补充 : 相关的表结构可以深入查询 Oracle 官方文档

1.2.6. 其他锁语句
查询那些用户, 操纵了那些表造成了锁机

查出被锁的表, 和锁住这个表的会话 ID

select a.session_id ,b.* from v$locked_object a,all_objects b where a.object_id=b.object_id

查出对应的 SQL 语句

SELECTvs.SQL_TEXT,vsess.sid,vsess.SERIAL vsess.MACHINE,vsess.OSUSER,vsess.TERMINAL,vsess.PROGRAM,vs.CPU_TIME,vs.DISK_READS 
FROMv$sql vs,v$session vsess 
WHEREvs.ADDRESS = vsess.SQL_ADDRESS AND vsess.sid = 36

补充语句 :

SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND LOCKS!='0';SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名';SELECT SID,SERIAL
SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的 PADDR';

1.3. 慢查询优化

1.3.1. SQL 部分
跳过索引:in、is null、not null
原因:
Oracle 中 in 会被试图转换成多个表的连接 , 转换不成功会先进行 in 中的子查询 , 再进行外部查询
不管哪个数据库 , 一般都是不推荐的 , 这种写法会跳过索引 建议:
- 多用 Where 语句把单个表的结果集最小化, 多用聚合函数汇总结果集后再与其它表做关联
- 多用 右连接
- 对于数据的过滤优先用 where, having 是对 where 的数据进行过滤组处理
- 总结 : 先过滤小的结果集, 然后通过这个小的结果集和其他表做关联
- 避免使用order by 和group by
- 在where字句中频繁使用的列上创建索引且 确保索引使用了与查询条件一致的数据类型- like 操作可以通过 instr 代替
- 用union ALL 操作符替代union, 因为union ALL操作只是简单的将两个结果合并后就返回,而union会额外触发一次排序

1.4. 性能优化

1.4.1. 整体性能优化流程

增大SGA缓冲

1.4.2. 硬件优化

此处是使用 IO 校准 (I/O Calibration), 可以用于评测一下数据库的 I/O 性能 , 通过 分析 IO 结果判断采用不同的策略

show parameters parallel_thread- 查询策略 : show parameters parallel_degree_policy
- 设置策略 : alter session set parallel_degree_policy = 'auto'- 打开系统默认设置的输出功能 : set serveroutput on
- 查看详情 : 
set serveroutput on
DECLARElat  INTEGER;iops INTEGER;mbps INTEGER;
BEGINDBMS_RESOURCE_MANAGER.CALIBRATE_IO (2, 10, iops, mbps, lat);DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops);DBMS_OUTPUT.PUT_LINE ('latency  = ' || lat);dbms_output.put_line('max_mbps = ' || mbps);
end;
/- 确定 sync : show parameter filesystemio_options
- 设置 sync : filesystemio_options- ASYNCH: 使 Oracle 支持文件的异步 (Asynchronous)IO- DIRECTIO: 使 Oracle 支持文件的 Direct IO- SETALL: 使 Oracle 同时支持文件的 Asynchronous IO 和 Direct IO- NONE: 使 Oracle 关闭对 Asynchronous IO 和 Direct IO 的支持1> alter system set filesystemio_options=setall scope=spfile;2> shutdown immediate;3> startupalter system set filesystemio_options=none scope=spfile;

1.5. 概念补充

1.5.1. SGA

系统全局区域 (SGA) 是一组共享内存结构, 称为 SGA 组件, 包含一个 Oracle 数据库实例的数据和控制信息。SGA 由所有服务器和后台进程共享。SGA 中存储的数据示例包括缓存的数据块和共享的 SQL 区域。

组成部分 :

  • Database buffer cache : 数据缓存
    • 在查询或修改数据库中存储的数据之前, 必须从磁盘读取数据并将其存储在缓冲区缓存中。
    • 所有连接到数据库的用户进程都共享对缓冲区缓存的访问。
    • 为了获得最佳性能, 缓冲区缓存应该足够大, 以避免频繁的磁盘 I/O 操作。
  • Shared pool : 共享池缓存用户共享的信息 , 包括如下内容
    • 可重用的 SQL 语句
    • 来自数据字典的信息, 例如用户帐户数据、表和索引描述以及特权
    • 存储过程, 它是存储在数据库中的可执行代码
  • Redo log buffer : 这个缓冲区通过缓存重做信息来提高性能, 直到可以将它写入存储在磁盘上的物理在线重做日志文件
  • Large pool : 这个可选区域用于为各种服务器进程缓冲大型 I/O 请求
  • Java pool : Java 池是用于 Java 虚拟机 (JVM) 中所有特定于会话的 Java 代码和数据的内存区域
  • Streams pool : Streams 池是 Oracle Streams 特性使用的内存区域
  • Result cache : 结果缓存缓冲区查询结果。如果运行的查询将结果存储在结果缓存中, 那么数据库将从结果缓存返回查询结果, 而不是重新运行查询。

PS:可以看看 《Oracle 数据库性能优化方法论和最佳实践》, 对数据库进行系统的优化。

2. 解析 oracle 对 select 加锁的方法以及锁的查询

2.1. oracle 对 select 加锁方法

create table test(a number,b number);
insert into test values(1,2);
insert into test values(3,4);
insert into test values(8,9);
commit;SQL> select * from test where a =1 for update skip locked;A          B1          2SQL> select * from test where a = 1 for update skip locked;
未选定行SQL> select * from test for update skip locked;A          B3          48          9
SQL>

2.2. 查询哪些用户, 操纵了那些表造成了锁机

SELECT s.username,
decode(l.type,‘TM’,‘TABLE LOCK’,
‘TX’,‘ROW LOCK’,
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM vsessions,vlock l,all_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+) AND s.username is NOT Null

2.3. 查出被锁的表, 和锁住这个表的会话 ID

select a.session_id ,b.* from v$locked_object a,all_objects b where a.object_id=b.object_id

2.4. 查出对应的 SQL 语句

select vs.SQL_TEXT,vsess.sid,vsess.SERIAL#,vsess.MACHINE,vsess.OSUSER
,vsess.TERMINAL,vsess.PROGRAM,vs.CPU_TIME,vs.DISK_READS
from vsqlvs,vsession vsess
where vs.ADDRESS=vsess.SQL_ADDRESS and vsess.sid=(上面查出来的会话 ID)

2.5. 集合

2.5.1. 查哪个过程被锁

查 VDBO​BJECTC​ACHE视图:

SELECT∗FROM VDB_OBJECT_CACHE WHERE OWNER=‘过程的所属用户’ AND LOCKS!=‘0’;

2.5.2. 查是哪一个 SID, 通过 SID 可知道是哪个 SESSION

查 VACCESS视图:

SELECT∗FROMVACCESS WHERE OWNER=‘过程的所属用户’ AND NAME=‘刚才查到的过程名’;

2.5.3. 查出 SID 和 SERIAL#

查 VKaTeX parse error: Expected 'EOF', got '#' at position 31: …LECT SID,SERIAL#̲,PADDR FROM VSESSION WHERE SID=‘刚才查到的 SID’
查 VPROCESS视图:SELECTSPIDFROMVPROCESS WHERE ADDR=‘刚才查到的 PADDR’;

2.5.4. 杀进程

(1). 先杀 ORACLE 进程:
ALTER SYSTEM KILL SESSION ‘查出的 SID, 查出的 SERIAL#’;
(2). 再杀操作系统进程:
KILL -9 刚才查出的 SPID
或 ORAKILL 刚才查出的 SID 刚才查出的 SPID

2.6. 查找最耗费系统资源的 SQL

–CPU

select b.sql_text,
a.buffer_gets,
a.executions,
a.buffer_gets/decode(a.executions , 0 , 1 , a.executions),
c.username
from Vsqlareaa,vsqltext_with_newlines b,
dba_users c
where a.parsing_user_id = c.user_id
and a.address = b.address order by a.buffer_gets desc , b.piece

–IO

select b.sql_text,
a.disk_reads,
a.executions,
a.disk_reads/decode(a.executions , 0 , 1 , a.executions),
c.username
from vsqlareaa,vsqltext_with_newlines b,
dba_users c
where a.parsing_user_id = c.user_id
and a.address = b.address order by a.disk_reads desc , b.piece

select s.sid,s.value “CPU Used”
from vsesstats,vstatname n
where s.statistic#=n.statistic# and n.name=‘CPU used by this session’
and s.value>0 order by 2 desc;

相关文章:

Oracle 慢sql排查

Oracle慢sql排查步骤 1.1. 前言 Oracle 慢查询的排查方向包括以下几个方向 : 基准测试 (吞吐量): 包括 Oracle 本身吞吐量和磁盘 I/O 吞吐量硬件分析 (资源情况): 包括查看服务器 CPU , 硬盘的使用情况SQL分析&#xff1a;分析 SQL 中是否存在慢查询 , 是否命中索引配置优化…...

[Protobuf] 快速上手:安全高效的序列化指南

标题&#xff1a;[Protobuf] (1)快速上手 水墨不写bug 文章目录 一、什么是protobuf&#xff1f;二、protobuf的特点三、使用protobuf的过程&#xff1f;1、定义消息格式&#xff08;.proto文件&#xff09;(1)指定语法版本(2)package 声明符 2、使用protoc编译器生成代码&…...

uniapp开发企业微信小程序时 wx.qy.login 在uniapp中使用的时候,需要导包吗?

在 UniApp 中使用 “wx.qy.login” 不需要手动导包&#xff0c;但需要满足以下条件&#xff1a; 一、环境要求与配置 1&#xfffd; 企业微信环境判断 必须确保当前运行环境是企业微信客户端&#xff0c;通过 “uni.getSystemInfoSync().environment” 判断是否为 “wxwork”…...

如何将通话记录从Android传输到Android

“如何将通话记录从 Android 转移到 Android&#xff1f;我换了一部新的 Android 手机&#xff0c;想要将通话记录复制到其中。”您需要将通话记录从 Android 传输到 Android 是一种常见的情况&#xff0c;因为通话记录是手机上最重要的数据之一。幸运的是&#xff0c;如果您从…...

Word 目录自动换行后错位与页码对齐问题解决教程

&#x1f4d8; Word 目录自动换行错位与页码对齐问题解决教程 &#x1f3af; 目标效果 目录条目过长自动换行后&#xff0c;第二行左对齐整齐&#xff1b;页码始终靠右对齐&#xff0c;前方带有“……”引导符&#xff1b;解决页码错位、制表符消失或格式混乱问题。 &#x1…...

数据结构第4章 栈、队列和数组 (竟成)

目录 第 4 章 栈、队列和数组 4.1 栈 4.1.1 栈的基本概念 4.1.2 栈的基本操作 4.1.3 栈的实现 1.顺序栈 2.链式栈 3.共享栈 4.1.4 顺序栈的基本操作实现 1.初始化栈 2.判空 3.判满 4.元素进栈 5.元素出栈 6.获取栈顶元素 4.1.5 链栈的基本操作实现 1.元素进栈 2.元素出栈 4.1.6…...

removeIf() 方法,结合 Lambda 表达式

在 Java 8 中,removeIf() 方法是 Collection 接口新增的一个默认方法,用于根据条件批量删除集合中的元素。结合 Lambda 表达式,可以以极简的语法实现复杂的过滤逻辑。以下是详细说明: 1. 方法定义与语法 // java.util.Collection 接口中的定义 default boolean removeIf(P…...

汽车售后诊断数据流详细分析

一、引言 随着汽车电子化程度的不断提升&#xff0c;电控系统已成为车辆运行的核心支撑。据罗兰贝格 2025 年智能汽车白皮书数据显示&#xff0c;中央计算 区域控制架构&#xff08;Zonal EEA&#xff09;的普及率已突破 58%&#xff0c;推动整车线束成本下降 41%12。与此同时…...

2025年渗透测试面试题总结-匿名[校招]安全研究员(SAST方向)(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 匿名[校招]安全研究员(SAST方向) 一面问题回答框架 1. 自我介绍 2. 简历深挖&#xff08;漏洞挖掘&#x…...

Unity 游戏优化(持续更新中...)

垃圾回收 是什么&#xff1f; 垃圾回收&#xff08;Garbage Collection&#xff09;GC 工作机制 1、Unity 为用户生成的代码和脚本采用了自动内存管理。 2、小块数据&#xff08;如值类型的局部变量&#xff09;分配在栈上。大块数据和长期存储分配在托管堆上。 3、垃圾收集…...

LlamaFactory——如何使用魔改后的模型

需求来源&#xff1a;有时我们可能想在llamafactory框架支持的模型上进行一些改动&#xff0c;例如修改forward()方法等&#xff0c;修改方法我们可以通过继承Transformers库中相应的class并重写相应的方法即可&#xff0c;那我们如何使用自己的模型呢&#xff1f; 首先&#…...

【前端】【css预处理器】Sass与Less全面对比与构建对应知识体系

第一章 概述 1.1 Sass和Less简介 1.1.1 Sass简介 Sass&#xff08;Syntactically Awesome Stylesheets&#xff09;是一种 CSS 预处理器&#xff0c;它为 CSS 赋予了更多强大的功能和更灵活的语法结构&#x1f60e;。 语法特点&#xff1a;Sass 有两种语法格式。一种是 .sa…...

【请关注】关于VC++实现使用Redis不同方法,有效达到 Redis 性能优化、防击穿

麻烦先关注方便了解最新分享。 关于VC实现使用Redis不同方法&#xff0c;有效达到 Redis 性能优化、防击穿。 一、性能优化核心方法 1. 使用连接池复用连接 // 连接池结构体 struct RedisPool { hiredisContext** connections; int size; sem_t sem; // 信号量控制并发 }; //…...

【加密算法】

计算机网络加密算法详解 在计算机网络中,加密算法是保障数据安全的核心技术,用于防止数据在传输过程中被窃听、篡改或伪造。本文将详细介绍常见的加密算法分类、工作原理及其在网络中的应用。 1. 加密算法分类 加密算法主要分为以下三类: 类型特点典型算法对称加密加密和解…...

20250529-C#知识:索引器

C#知识&#xff1a;索引器 索引器给对象添加了索引访问的功能&#xff0c;实际访问的是对象的成员&#xff0c;感觉不太常用。 1、主要内容及代码示例 索引器中类似属性&#xff0c;也包含get和set方法索引器能够使像访问数组一样访问对象一般当类中有数组类型的成员变量时&am…...

【笔记】suna部署之获取 Tavily API key

#工作记录 Tavily 注册 Tavily 账号5&#xff1a; 打开浏览器&#xff0c;访问 Tavily 官网Tavily AI。点击页面上的 “注册” 按钮&#xff0c;按照提示填写注册信息&#xff0c;如邮箱地址、设置密码等&#xff0c;完成注册流程。也可以选择使用 Google 或 GitHub 账号授权登…...

06-Web后端基础(java操作数据库)

1. 前言 在前面我们学习MySQL数据库时&#xff0c;都是利用图形化客户端工具(如&#xff1a;idea、datagrip)&#xff0c;来操作数据库的。 我们做为后端程序开发人员&#xff0c;通常会使用Java程序来完成对数据库的操作。Java程序操作数据库的技术呢&#xff0c;有很多啊&a…...

JavaScript性能优化实战的技术文-——仙盟创梦IDE

JavaScript性能优化实战技术文章大纲 性能优化的核心原则 减少代码执行时间降低内存消耗优化网络请求提升用户体验 代码层面的优化 减少全局变量使用&#xff0c;避免命名冲突和内存泄漏使用节流&#xff08;throttle&#xff09;和防抖&#xff08;debounce&#xff09;优…...

GitHub Copilot 使用手册与原理解析

一、Copilot 简介 GitHub Copilot 是由 GitHub 联合 OpenAI 推出的 AI 编程助手。它能在你编程时&#xff0c;基于上下文智能补全代码、自动生成函数、编写测试用例、解释代码含义等&#xff0c;大幅提高编程效率。 即便有 Google、Amazon、Meta 等强劲竞争对手推出免费工具&…...

vllm 2080TI ubuntu环境安装

#TOC 欢迎使用Markdown编辑器安装gcc 9 sudo add-apt-repository ppa:ubuntu-toolchain-r/testsudo apt-get install gcc-9 g-9sudo apt-get install gcc-9 g-9sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g g /usr/bin/g-9gcc …...

【C语言】指针详解(接)

前言&#xff1a; 文接上章&#xff0c;在上章节讲解了部分指针知识点&#xff0c;在本章节为大家继续提供。 六指针与字符串&#xff1a;C 语言字符串的本质 在 C 语言中&#xff0c;字符串实际上是一个以\0结尾的字符数组。字符串常量本质上是指向字符数组首元素的指针&…...

【C】箭头运算符

在C语言中&#xff0c;p_tone->power_off 是一种通过指针访问结构体成员的方法&#xff0c;称为箭头运算符&#xff08;->&#xff09;。它主要用于以下场景&#xff1a; 1. 语法解释 p_tone&#xff1a;是一个指向结构体&#xff08;或联合体&#xff09;的指针。powe…...

HTTP Accept简介

一、HTTP Accept是什么 HTTP协议是一个客户端和服务器之间进行通信的标准协议&#xff0c;它定义了发送请求和响应的格式。而HTTP Accept是HTTP协议中的一个HTTP头部&#xff0c;用于告诉服务器请求方所期望的响应格式。这些格式可以是媒体类型、字符集、语言等信息。 HTTP A…...

什么是单片机?

众所周知&#xff0c;人类行为受大脑调控&#xff0c;正如视觉、听觉、味觉、嗅觉、触觉及运动功能等感官与肢体活动均受其指挥&#xff1b;换言之&#xff0c;大脑作为人体的中枢神经系统&#xff0c;负责管理所有可控制的生理功能。 在电子设备领域&#xff0c;单片机…...

联通专线加持!亿林网络 24 核 32G 裸金属服务器,千兆共享带宽适配中小型企业 IT 架构

在当今数字化时代&#xff0c;企业的业务运营越来越依赖高效、稳定的 IT 架构。对于中小型企业而言&#xff0c;如何在有限的预算内构建强大且可靠的 IT 基础设施&#xff0c;是一项关键挑战。亿林网络推出的 24 核 32G 裸金属服务器&#xff0c;搭配联通专线和千兆共享带宽&am…...

Ubuntu的shell脚本

关于shell脚本 • shell脚本是文本的一种。 • shell脚本是可以运行的文本。 • shell脚本的内容是由说辑和数据组成。 • shell 脚本是解释型语言。 shell脚本存在的意义 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具 Linux/UNIX系统…...

微信小程序页面嵌套web-view点击系统导航返回时进行弹窗处理

实现效果&#xff1a;微信小程序页面嵌套web-view点击系统导航返回时进行弹窗处理 首先在web-view里是不可实现的&#xff08;据我了解下来&#xff09; 参考小程序文档&#xff1a;page-container 大致逻辑&#xff1a; 1、page-container可实现页面离开前拦截 2、由于web-vie…...

从抄表到节能,电费管理系统如何重构公寓运营场景——仙盟创梦IDE

租房公寓电费管理系统是集智能计量、自动化计费、线上缴费、数据管理于一体的综合性解决方案&#xff0c;旨在解决传统电费管理中人工抄表误差大、收费效率低、纠纷频发等痛点。系统通过部署智能电表实时采集用电数据&#xff0c;结合云计算与大数据分析技术&#xff0c;实现电…...

Rust 学习笔记:关于闭包的练习题

Rust 学习笔记&#xff1a;关于闭包的练习题 Rust 学习笔记&#xff1a;关于闭包的练习题问题 1问题 2以下程序能否通过编译&#xff1f;若能&#xff0c;输出是&#xff1f;以下程序能否通过编译&#xff1f;若能&#xff0c;输出是&#xff1f;考虑该 API&#xff0c;空白处填…...

记一次前端逻辑绕过登录到内网挖掘

前言 在测试一个学校网站的时候&#xff0c;发现一个未授权访问内网系统&#xff0c;但是这个未授权并不是接口啥的&#xff0c;而是对前端 js 的审计和调试发现的漏洞&#xff0c;这里给大家分享一下这次的漏洞的过程。 进入内网的过程 可以看到是一个图书馆的网站&#xff…...