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

深入理解Oracle DB的锁和闩

1. 引言

本文深入介绍Oracle DB的锁和闩。

2. Oracle DB 锁的基本概念

2.1 定义与作用

锁是 Oracle 数据库用于控制并发访问的一种机制。它用于防止多个事务同时对同一数据进行不一致的操作,确保数据的完整性和一致性。例如,当一个事务正在更新一行数据时,通过加锁可以防止其他事务同时对这行数据进行更新或删除操作。

2.2 锁的类型

  1. 共享锁(Share Lock,S Lock): 允许同时有多个事务对同一数据进行读取操作。例如,多个用户可以同时查询同一张表中的数据,这时可以对表加上共享锁。共享锁之间是兼容的,即一个事务对数据加上共享锁后,其他事务仍然可以对该数据加上共享锁来进行读取。
  2. 排他锁(Exclusive Lock,X Lock): 当一个事务对数据加上排他锁后,其他事务既不能对该数据进行读取操作,也不能进行写入操作。排他锁主要用于数据的修改操作,如插入、更新和删除,以确保在操作过程中数据的完整性。例如,一个事务正在更新表中的一行数据,就会对该行数据加上排他锁。
  3. 行级锁(Row - level Lock): 这种锁是对表中的行进行锁定。例如,在一个事务更新表中的某一行时,只会锁定这一行,而不会影响表中的其他行,这样可以提高并发性能,使其他事务能够同时访问表中的其他行。
  4. 表级锁(Table - level Lock): 是对整个表进行锁定。表级锁可以是共享表级锁或排他表级锁。当需要对整个表进行批量操作(如删除所有行)或者需要确保整个表的一致性时,可以使用表级锁。不过表级锁会限制其他事务对表的访问,可能会影响并发性能。

3. Oracle DB 锁的工作原理

3.1 锁的获取与释放

当一个事务需要访问数据并且需要保证数据的一致性时,它会请求相应的锁。例如,当执行一个UPDATE语句时,事务会自动请求排他行级锁。锁会一直保持到事务结束(提交或回滚)。在事务提交或回滚后,所获取的锁会自动释放。

3.2 锁的兼容性矩阵

共享锁和排他锁之间是不兼容的,即如果一个数据已经被加上排他锁,其他事务不能再对其加共享锁或排他锁;而共享锁之间是兼容的,多个事务可以同时对同一数据加共享锁。这种兼容性规则确保了在多事务并发访问数据时,数据的读写操作能够按照合理的顺序进行。

3.3 死锁处理

死锁是指两个或多个事务相互等待对方释放锁的情况。例如,事务 A 锁定了资源 S 并等待获取资源 T,而事务 B 锁定了资源 T 并等待获取资源 S。Oracle 数据库有自动检测死锁的机制,当检测到死锁时,会选择一个事务作为牺牲品进行回滚,以解除死锁状态,让其他事务能够继续执行。
在这里插入图片描述

4. Oracle DB 闩(Latch)的基本概念

4.1 定义与作用

闩是一种比锁更轻量级的保护机制,用于保护 Oracle 数据库内部的内存结构。它主要用于控制对共享内存资源(如缓存、数据结构等)的并发访问。例如,在数据库缓存(Buffer Cache)中,多个进程可能会同时访问缓存中的数据块,闩可以确保这些访问是有序的,防止数据不一致。

4.2 闩与锁的区别

锁主要用于保护数据库中的数据对象(如表、行),用于事务之间的并发控制;而闩主要用于保护数据库内部的系统资源和内存结构,是在更底层的操作中使用。锁的操作通常是由用户事务发起的,并且可以在事务的整个生命周期内持续存在;而闩的持有时间通常很短,只是在对内部资源进行短暂操作时使用。

4.3 Oracle DB 闩的工作原理

4.3.1 闩的获取与释放

当一个数据库进程需要访问受闩保护的内存结构时,它会尝试获取闩。如果闩已经被其他进程占用,该进程会等待(短暂等待,通常是自旋等待),直到闩被释放。一旦获取闩,进程就可以对受保护的内存结构进行操作,操作完成后会立即释放闩,以允许其他进程访问。

4.3.2 闩的类型和应用场景
  1. 共享闩(Share Latch): 用于多个进程可以同时访问但需要协调访问顺序的内存结构。例如,在数据库的库缓存(Library Cache)中,多个进程可能需要查询相同的 SQL 语句解析结果,共享闩可以确保这些进程能够安全地共享这些资源。
  2. 排他闩(Exclusive Latch): 用于对内存结构进行独占式操作的情况。例如,当需要对缓存中的数据块进行更新(如从磁盘读取新的数据块替换缓存中的旧数据块)时,会使用排他闩来防止其他进程在更新过程中访问该数据块。

5. 监控和管理数据库的锁和闩

5.1 使用动态性能视图进行监控

  1. V L O C K 视图 V LOCK 视图 V LOCK视图VLOCK视图提供了数据库中当前持有的锁的信息。它包含了诸如会话 ID(SID)、锁类型、锁模式、被锁定对象的 ID 等重要信息。例如,可以通过查询这个视图来了解哪些会话正在持有锁,以及这些锁是共享锁还是排他锁。
    示例:
SELECT SID, TYPE, LMODE, ID1, ID2
FROM V$LOCK;

这个查询会返回每个锁的会话 ID、锁类型(如TM代表表级锁,TX代表事务锁等)、锁模式(数字表示,如 0 表示无锁,1 表示空共享锁,2 表示行共享锁,3 表示排他锁等)以及被锁定对象的标识符(ID1和ID2)。通过这些信息,可以分析锁的分布情况和锁的严重程度。

  1. V L A T C H 视图 V LATCH 视图 V LATCH视图VLATCH视图用于查看闩的相关信息。它展示了闩的名称、获取次数、等待次数等内容。这些信息对于了解数据库内部资源的并发访问情况非常重要。
    示例:
SELECT NAME, GETS, MISSES, SLEEPS
FROM V$LATCH;

其中GETS表示闩的获取次数,MISSES表示获取闩时未成功(需要等待)的次数,SLEEPS表示由于等待闩而导致进程睡眠的次数。通过这些统计信息,可以判断是否存在闩争用问题,以及哪些闩可能需要进一步优化。

5.2 使用 Oracle Enterprise Manager(OEM)进行管理和监控

  1. 图形化界面操作
    OEM 提供了一个直观的图形化界面来管理和监控数据库。在 OEM 中,可以方便地查看锁和闩的信息。例如,可以通过导航到 “性能” - > “并发” - > “锁” 来查看当前数据库中的锁活动情况(不同版本DB 会有差异)。在这里,可以看到锁的持有者、被锁定的对象、锁等待情况等详细信息,并且可以通过图形化的方式直观地展示锁的冲突和等待链。
    对于闩的监控,同样可以在 OEM 的相关性能监控模块中找到。可以查看闩的使用率、等待时间等统计数据的图表,以便及时发现潜在的性能问题。
  2. 设置警报和阈值
    OEM 允许设置警报来提醒管理员关于锁和闩的异常情况。例如,可以设置当锁等待时间超过一定阈值(如 10 秒)或者闩的等待次数达到某个数值时,自动发送警报通知。通过这种方式,可以及时发现并处理可能影响数据库性能的问题。

5.3 SQL Trace 和 TKPROF 工具的使用

  1. SQL Trace 原理
    SQL Trace 是 Oracle 提供的一个工具,用于跟踪数据库中的 SQL 语句执行情况。它可以记录 SQL 语句的执行计划、资源使用情况(包括锁和闩的使用)等详细信息。当启用 SQL Trace 后,数据库会在后台记录每个被跟踪的 SQL 语句相关的信息。
  2. TKPROF 工具分析
    TKPROF 是一个用于分析 SQL Trace 输出文件的工具。通过运行 TKPROF 工具,可以得到关于 SQL 语句的详细报告,包括锁等待时间、闩等待时间等信息。例如,可以通过以下步骤使用这些工具:
    首先,在数据库中启用 SQL Trace 来跟踪特定会话或整个系统的 SQL 语句执行情况:
    ALTER SESSION SET SQL_TRACE = TRUE;
    然后,让数据库执行相关操作,之后使用 TKPROF 工具分析生成的跟踪文件(假设跟踪文件名为trace_file.trc):
    tkprof trace_file.trc output_file.txt
    在生成的output_file.txt报告中,可以查找与锁和闩相关的部分,如WAIT #n:部分会显示等待事件的详细信息,包括锁等待和闩等待事件,通过分析这些信息可以确定哪些 SQL 语句导致了锁和闩的问题。

5.4 使用数据库内置的包进行锁管理

  1. DBMS_LOCK 包
    DBMS_LOCK包提供了一系列用于显式地请求、释放和转换锁的过程和函数。例如,可以使用REQUEST函数来请求一个特定类型的锁,使用RELEASE函数来释放一个锁。
    示例:
DECLARElock_handle VARCHAR2(128);return_code NUMBER;
BEGINDBMS_LOCK.ALLOCATE_UNIQUE('my_lock_name', lock_handle);return_code := DBMS_LOCK.REQUEST(lock_handle, DBMS_LOCK.X_MODE, 0, TRUE, 0);-- 执行需要排他锁保护的操作DBMS_LOCK.RELEASE(lock_handle);
END;

这个示例代码首先为一个自定义的锁名称分配一个唯一的锁句柄,然后使用REQUEST函数请求一个排他锁(X_MODE),在执行完需要保护的操作后,使用RELEASE函数释放锁。这种方式可以在应用程序中对锁进行更精细的控制,特别是在复杂的并发场景中。

6. 如何解决数据库中的锁和闩争用问题

6.1 优化事务设计

  1. 减少事务的持有时间
    事务持有锁的时间越长,其他事务等待锁的可能性就越大。因此,应尽量使事务中的操作简洁高效,避免在事务中包含不必要的长时间操作。
    例如:如果一个事务需要更新数据库中的大量数据,不要在一个事务中一次性更新所有数据,可以将更新操作拆分成多个小事务,每次更新一部分数据,这样可以减少每个事务持有锁的时间,降低锁争用的概率。例如,将一个更新 100 万行数据的事务拆分成 100 个每次更新 1 万行数据的事务。
  2. 事务隔离级别调整
    不同的事务隔离级别对锁的使用方式和范围有所不同。例如,在Serializable隔离级别下,会对读取的数据加共享锁,并且会一直持有到事务结束,这可能导致较高的锁争用。如果应用程序可以接受一定程度的数据不一致性(如允许读取到未提交的数据),可以适当降低隔离级别来减少锁的使用。
    例如:在一个主要是查询操作,对数据一致性要求不是极高的系统中,可以将事务隔离级别从Serializable调整为Read Committed。在Read Committed隔离级别下,事务读取数据时不会对数据加锁(读取的是已经提交的数据),只有在更新数据时才会加排他锁,这样可以有效减少锁的使用和争用。

6.2 优化 SQL 语句和查询执行计划

  1. 索引优化
    合理的索引可以加快 SQL 语句的执行速度,减少事务的执行时间,从而间接减少锁的持有时间。例如,在一个经常用于查询和更新的表中,如果在查询条件和更新条件涉及的列上建立索引,数据库引擎在执行操作时可以更快地定位到需要的数据,减少全表扫描的可能性,因为全表扫描可能会对整个表加锁,导致锁争用。
    例:对于一个包含customer_id、customer_name和customer_order_date等列的customers_orders表,如果经常根据customer_id进行查询和更新操作,如SELECT * FROM customers_orders WHERE customer_id = 123或UPDATE customers_orders SET customer_order_date = SYSDATE WHERE customer_id = 123,可以在customer_id列上建立索引,这样数据库在执行这些操作时能够更快地找到相关数据,减少锁的使用范围和时间。
  2. 避免复杂的关联查询和子查询
    复杂的查询可能会导致数据库执行计划复杂,涉及多个表的锁操作。例如,一个包含多个嵌套子查询和多表连接的查询可能会导致数据库在执行过程中对多个表加锁,增加锁争用的风险。尽量简化查询,减少不必要的表连接和子查询,可以降低锁的使用。
    例:如果有一个复杂的查询,如SELECT * FROM table1 JOIN (SELECT * FROM table2 WHERE condition) subquery ON table1.id = subquery.id,可以考虑将子查询转换为临时表或者视图,或者重新设计查询逻辑,减少嵌套层次和表连接的复杂性,从而减少锁的使用。

6.3 调整数据库对象结构和参数

  1. 分区表的使用
    对于大型表,使用分区表可以将数据划分到不同的分区,在进行操作时可以只对相关分区加锁,而不是对整个表加锁。这样可以提高并发性能,减少锁争用。
    例:对于一个存储销售订单数据的大型表,按照日期范围进行分区,如每个月的数据为一个分区。当需要对某个月的订单数据进行更新或查询时,数据库只会对相应月份的分区加锁,而不会影响其他月份分区的数据访问,从而有效减少锁争用。
  2. 调整闩相关参数
    闩的性能和行为可以通过一些数据库参数进行调整。例如,通过调整闩等待时间相关参数,可以控制数据库进程在获取闩时等待的时间,避免进程长时间等待闩而导致性能下降。
    例:在 Oracle 数据库中,可以通过参数_spin_count来调整闩的自旋等待次数。适当增加这个参数的值可以减少进程在等待闩时进入睡眠状态的次数,提高闩的获取效率,但也可能会增加 CPU 的开销。需要根据实际情况进行调整,如在一个 CPU 资源丰富的系统中,可以适当增加_spin_count来提高闩的性能。

6.4 应用程序层面的优化

  1. 连接池优化
    在多用户应用程序中,连接池用于管理数据库连接。如果连接池配置不合理,可能会导致过多的连接同时请求锁和闩。例如,连接池中的连接数过多可能会导致数据库负载过重,增加锁和闩争用的可能性;连接数过少则可能会导致应用程序等待连接,影响性能。
    例:根据应用程序的并发访问量和数据库服务器的性能,合理配置连接池的大小。可以通过性能测试来确定最佳的连接池大小,例如,在一个 Web 应用程序中,开始时可以设置连接池大小为 100,通过性能测试工具模拟并发访问,观察数据库的负载、锁和闩争用情况以及应用程序的响应时间,根据测试结果逐步调整连接池大小,找到一个既能满足并发访问需求,又能减少锁和闩争用的合适值。
  2. 缓存策略的使用
    在应用程序中使用缓存可以减少对数据库的直接访问,从而减少锁和闩的使用。例如,对于一些频繁查询但很少更新的数据,可以将其缓存到应用程序的内存中,当需要访问这些数据时,先从缓存中获取,只有在缓存中不存在或者数据已过期时才访问数据库。
    例:在一个电商应用程序中,商品分类信息通常很少更新,可以将商品分类信息缓存到应用程序的内存中。当用户浏览商品分类时,直接从缓存中获取分类信息,而不需要对数据库中的分类表进行查询和加锁操作,这样可以有效减少锁争用,提高应用程序的性能。

7. 后记

锁问题一直是事务处理和高并发编程的核心问题,大家一定要搞透彻明白才能写出高效的代码。

码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,后续不定期分享DB基本知识和排障案例及经验、性能调优等。

相关文章:

深入理解Oracle DB的锁和闩

1. 引言 本文深入介绍Oracle DB的锁和闩。 2. Oracle DB 锁的基本概念 2.1 定义与作用 锁是 Oracle 数据库用于控制并发访问的一种机制。它用于防止多个事务同时对同一数据进行不一致的操作,确保数据的完整性和一致性。例如,当一个事务正在更新一行数…...

mcu上一种利用伪随机数防止mac地址冲突的方法

一 前言 前段时间开发的一个带tcp功能的项目,出现了mac地址冲突的问题,领导让随机生成一个mac地址,因此研究了下随机数。 二 预研 1.硬随机数 硬随机数又叫真随机数,英文名称”true random number generator“,即通过硬件随机数…...

C# 索引器(Indexer)

文章目录 前言一、索引器的语法规则二、索引器的用途及与属性的对比三、索引器的重载 前言 在 C# 编程中,索引器(Indexer)是一项极具特色且实用的语言特性,它赋予了对象一种独特的访问方式,使得对象能够如同数组一般&a…...

【大数据学习 | Spark-SQL】定义UDF和DUAF,UDTF函数

1. UDF函数(用户自定义函数) 一般指的是用户自己定义的单行函数。一进一出,函数接受的是一行中的一个或者多个字段值,返回一个值。比如MySQL中的,日期相关的dateDiff函数,字符串相关的substring函数。 先…...

Springboot集成通义大模型

1.先到阿里云平台开头阿里云白炼账号&#xff0c;创建apiKey 2. 引入maven依赖 <dependency><groupId>com.alibaba</groupId><artifactId>dashscope-sdk-java</artifactId><version>2.8.3</version></dependency><!-- htt…...

Xilinx PCIe高速接口入门实战(一)

引言&#xff1a;本文对Xilinx 7 Series Intergrated Block for PCI Express PCIe硬核IP进行简要介绍&#xff0c;主要包括7系列FPGA PCIe硬核资源支持、三IP硬核差异、PCIe硬核资源利用等相关内容。 1. 概述 1.1 7系列FPGA PCIe硬件资源支持 7系列FPGA对PCIe接口最大支持如…...

区块链游戏的新观察:自治世界能否成为未来链游的突破口?

区块链游戏&#xff08;链游&#xff09;作为加密领域的创新方向&#xff0c;一直被寄予厚望。然而&#xff0c;尽管各类链游层出不穷&#xff0c;大多只是靠代币激励一时爆火&#xff0c;缺乏持久吸引力。这种现象让人对链游未来的发展充满疑虑&#xff1a;是否有一种全新的设…...

Linq中的投影运算 (C#):Select、SelectMany、Zip

投影是指将对象转换为一种新形式的操作&#xff0c;该形式通常只包含那些将随后使用的属性。 通过使用投影&#xff0c;您可以构造从每个对象生成的新类型。 可以投影属性&#xff0c;并对该属性执行数学函数。 还可以在不更改原始对象的情况下投影该对象。 1、Select 下面的…...

GPU 服务器厂家:怎样铸就卓越 AI 算力?

文章来源于百家号&#xff1a;GPU服务器厂家 今天咱来聊聊 GPU 服务器厂家那些事儿&#xff0c;而这其中衡量 AI 算力的因素可是关键所在哦。 先讲讲计算速度这一块。咱都知道 AI 那复杂的活儿&#xff0c;像训练超厉害的图像识别模型&#xff0c;得处理海量图像数据&#x…...

数据结构与算法——N叉树(自学笔记)

本文参考 N 叉树 - LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 遍历 前序遍历&#xff1a;A->B->C->E->F->D->G后序遍历&#xff1a;B->E->F->C->G->D->A层序遍历&#xff1a;A->B->C->D->…...

浏览器的数据六种存储方法比较 :LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite

在构建该 Web 应用程序&#xff0c;并且希望将数据存储在用户浏览器中。也许您只需要存储一些小标志&#xff0c;或者甚至需要一个成熟的数据库。 我们构建的 Web 应用程序类型发生了显着变化。在网络发展的早期&#xff0c;我们提供静态 html 文件。然后我们提供动态渲染的 h…...

Rust个人认为将抢占C和C++市场,逐渐成为主流的开发语言

本人使用C开发8年、C#开发15年、中间使用JAVA开发过项目、后期在学习过程中发现了Rust语言说它是最安全的语言&#xff0c;能够解决C、C的痛点、于是抽出一部分时间网上买书&#xff0c;看网上资料进行学习&#xff0c;这一学习起来发现和其它语言比较起来&#xff0c;在编码的…...

electron-updater软件自动检测更新 +无服务器本地测试

大家好&#xff0c;我是小黄。 今天分享一下如何0基础实现electron自动检测更新功能。 一. 安装 electron-updater 实现自动更新 安装依赖 electron-updater npm install electron-updater 二. 修改package.josn "publish": {"provider": "generi…...

Flink在Linux系统上的安装与入门

一、Flink的引入 这几年大数据的飞速发展&#xff0c;出现了很多热门的开源社区&#xff0c;其中著名的有Hadoop、Storm&#xff0c;以及后来的Spark&#xff0c;他们都有着各自专注的应用场景。Spark 掀开了内存计算的先河&#xff0c;也以内存为赌注&#xff0c;赢得了内存计…...

鸿蒙面试---都用过哪些装饰器

必答的 State装饰器&#xff1a;组件内状态 State装饰的变量&#xff0c;或称为状态变量&#xff0c;一旦变量拥有了状态属性&#xff0c;就可以触发其直接绑定UI组件的刷新。当状态改变时&#xff0c;UI会发生对应的渲染改变。Prop装饰器&#xff1a;父子单向同步Prop装饰的变…...

微信小游戏/抖音小游戏SDK接入踩坑记录

文章目录 前言问题记录1、用是否存在 wx 这个 API 来判断是微小平台还是抖小平台不生效2、微小支付的参数如何获取?3、iOS 平台不支持虚拟支付怎么办?微小 iOS 端支付时序图:抖小 iOS 端支付:4、展示广告时多次回调 onClose5、在使用单例时 this 引起的 bug6、使用 fetch 或…...

uniapp配置全局消息提醒

1.H5使用根标签插入dom的方式实现。 2.app端使用plus.nativeObj.View的方式绘制实现 H5端app端 H5端 创建组件orderAlert.vue <template><div class"view"><div class"content" v-if"visible"><div class"message&q…...

Docker学习

&#x1f389;Docker 简介和安装 Docker 是什么 Docker 是一个应用打包、分发、部署的工具 你也可以把它理解为一个轻量的虚拟机&#xff0c;它只虚拟你软件需要的运行环境&#xff0c;多余的一点都不要&#xff0c; 而普通虚拟机则是一个完整而庞大的系统&#xff0c;包含各…...

【Electron学习笔记(三)】Electron的主进程和渲染进程

Electron的主进程和渲染进程 Electron的主进程和渲染进程前言正文1、主进程2、渲染进程3、Preload 脚本3.1 在项目目录下创建 preload.js 文件3.2 在 main.js 文件下创建路径变量并将 preload.js 定义为桥梁3.3 在 preload.js 文件下使用 electron 提供的contextBridge 模块3.4…...

人工智能的微积分基础

目录 ​编辑 引言 微积分的基本概念 1. 导数 2. 积分 3. 微分方程 微积分在人工智能中的应用 1. 机器学习中的优化 2. 反向传播算法 3. 概率与统计 4. 控制理论 5. 自然语言处理中的梯度 6. 计算机视觉中的积分 7. 优化算法中的微积分 8. 微分几何在深度学习中的…...

关于BeanUtils.copyProperties是否能正常复制字段【详细版】

话不多说&#xff01;先总结&#xff1a; 1、字段相同&#xff0c;类型不同&#xff08;不复制&#xff0c;也不报错&#xff09; 2、子类父类 (1)子类传给父类&#xff08;可以正常复制&#xff09; (2)父类传给子类&#xff08;可以正常复制&#xff09; 3、子类父类&#x…...

oracle将select作为字段查询

在Oracle中&#xff0c;如果你想将一个SELECT语句作为字段的值&#xff0c;你可以使用子查询或者使用WITH子句&#xff08;也称为公用表表达式CTE&#xff09;。以下是两种方法的示例&#xff1a; 方法1&#xff1a;使用子查询 语法如下&#xff1a; SELECTcolumn1,(SELECT …...

FFmpeg 简介与编译

1. ffmpeg 简介&#xff1a; FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec&#xff0c;为了保证高可移…...

qt QLinearGradient详解

1、概述 QLinearGradient是Qt框架中QGradient的一个子类&#xff0c;用于创建线性渐变效果。线性渐变是一种颜色沿着一条直线平滑过渡到另一种颜色的效果。QLinearGradient允许你定义渐变的起点和终点&#xff0c;以及在这些点之间的颜色变化。你可以使用它来为图形、背景、边…...

点击A组件跳转到B页面的tab的某一列

1、使用vuex存储点击的数据&#xff1b; 点击A组件里面的button按钮&#xff1a; <div><button click"banli(first)">已办理</button><button click"banli(second)">未办理</button><button click"banli(third)&quo…...

图像小波去噪与总变分去噪详解与Python实现

目录 图像小波去噪与总变分去噪详解与实现1. 基础概念1.1 噪声类型及去噪问题定义1.2 小波去噪算法基础1.3 总变分去噪算法基础2. 小波去噪算法2.1 理论介绍2.2 Python实现及代码详解2.3 案例分析3. 总变分去噪算法3.1 理论介绍3.2 Python实现及代码详解3.3 案例分析4. 两种算法…...

mvn-mac操作小记

1.安装brew 如果报错&#xff0c;Warning: /opt/homebrew/bin is not in your PATH. vim ~/.zshrc&#xff0c;最后一行追加 export PATH“/opt/homebrew/bin:$PATH” source ~/.zshrc 2.安装brew install maven mvn -version查看路径 Maven home: /opt/homebrew/Cellar/mav…...

【娱乐项目】基于批处理脚本与JavaScript渲染视频列表的Web页面

Demo介绍 一个简单的视频播放器应用&#xff0c;其中包含了视频列表和一个视频播放区域。用户可以通过点击视频列表中的项来选择并播放相应的视频&#xff0c;播放器会自动播放每个视频并在播放完毕后切换到下一个视频。本项目旨在通过自动化脚本和动态网页渲染&#xff0c;帮助…...

Faster R-CNN (目标检测)

Faster R-CNN (Faster Region-based Convolutional Neural Networks) Faster R-CNN 是一种高效的目标检测模型&#xff0c;它是在 R-CNN 系列&#xff08;包括 R-CNN 和 Fast R-CNN&#xff09;的基础上发展而来的&#xff0c;能够实现对图像中多个对象的检测。Faster R-CNN 引…...

Diffusion中的Unet (DIMP)

针对UNet2DConditionModel模型 查看Unet的源码&#xff0c;得知Unet的down,mid,up blocks的类型分别是&#xff1a; down_block_types: Tuple[str] ("CrossAttnDownBlock2D","CrossAttnDownBlock2D","CrossAttnDownBlock2D","DownBlock2…...

docker服务容器化

docker服务容器化 1 引言2 多个容器间网络联通2.1 单独创建关联2.2 创建时关联 3 服务搭建3.1 镜像清单3.2 容器创建 4 联合实战4.2 flink_sql之kafka到starrocks4.2 flink_sql之mysql到starrocks 5 文献借鉴 1 引言 ​ 利用docker可以很效率地搭建服务&#xff0c;本文在win1…...

Flink 从入门到实战

Flink中的批和流 批处理的特点是有界、持久、大量&#xff0c;非常适合需要访问全部记录才能完成的计算工作&#xff0c;一般用于离线统计。 流处理的特点是无界、实时, 无需针对整个数据集执行操作&#xff0c;而是对通过系统 传输的每个数据项执行操作&#xff0c;一般用于实…...

ffmpeg安装(windows)

ffmpeg安装-windows 前言ffmpeg安装路径安装说明 前言 ffmpeg的安装也是开箱即用的,并没有小码哥说的那么难 ffmpeg安装路径 这就下载好了! 安装说明 将上面的bin目录加入到环境变量,然后在cmd中测试一下: C:\Users\12114\Desktop\test\TaskmgrPlayer\x64\Debug>ffmpe…...

深度解析:Android APP集成与拉起微信小程序开发全攻略

目录 一、背景以及功能介绍 二、Android开发示例 2.1 下载 SDK 2.2 调用接口 2.3 获取小程序原始Id 2.4 报错提示&#xff1a;bad_param 2.4.1 错误日志 2.4.2 解决方案 相关推荐 一、背景以及功能介绍 需求&#xff1a;产品经理需要APP跳转到公司的小程序(最好指定页…...

DeSTSeg: Segmentation Guided Denoising Student-Teacher for Anomaly Detection

DeSTSeg: Segmentation Guided Denoising Student-Teacher for Anomaly Detection 清华、苹果 个人感觉 Introduction 很自然的让读者理解作者问题的提出&#xff0c;也有例子直接证明了这个问题的存在&#xff0c;值得借鉴&#xff01;&#xff01; Related work写的也很不…...

Xilinx Blockset Gateway In 和Gateway out模块使用及参数配置

目录 一、Gateway InSimulink数据到System Generator数据的转换Gateway BlocksBlock Parameters&#xff08;模块参数&#xff09;Basic选项卡参数Implementation选项卡参数 二、Gateway OutGateway BlocksBlock Parameters&#xff08;模块参数&#xff09;Basic选项卡参数Imp…...

set up RAGFlow on your Mac

个人思考&#xff1a;这些仅仅是工具&#xff0c;和人的思维实际还是有很大差距。 可能是我认知片面&#xff0c;你需要投喂大量的内容给它&#xff0c;它自己其实并不会思考&#xff0c;只是从它的认知里告诉它他知道的东西。举个不太巧当的例子&#xff0c;和以往的方式恰恰相…...

SSM搭建(1)——配置MyBatis

目录 一、框架概述 1.什么是JDBC&#xff1f; 2.JDBC基本流程 3.JDBC的缺点 二、MyBatis的入门程序 1. 创建数据库和表结构 2. MyBatis入门流程总结 3. MyBatis的入门步骤 &#xff08;1&#xff09; 创建maven的项目&#xff0c;创建Java工程即可。 &…...

SickOs: 1.1靶场学习小记

学习环境 kali攻击机&#xff1a;Get Kali | Kali Linux vulnhub靶场&#xff1a;https://download.vulnhub.com/sickos/sick0s1.1.7z 靶场描述&#xff1a; 这次夺旗赛清晰地模拟了在安全环境下如何对网络实施黑客策略从而入侵网络的过程。这个虚拟机与我在进攻性安全认证专…...

Flume 监控配置和实践

要解释 Flume 的监控机制&#xff0c;需要了解 Flume 是如何设计其监控架构的&#xff0c;以及如何将性能指标暴露给用户或集成工具。下面我将详细分解 Flume 的监控机制&#xff0c;从基础架构、实现原理到源码解析&#xff0c;并提供非专业人也能理解的通俗解释。 Flume 的监…...

二分法算法

提示&#xff1a;文章 文章目录 前言一、背景二、二分法2.2 最坏情况下冒泡排序的比较次数 三、大算法之一&#xff1a;分治法总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 二分法 一、背景 问题来源是一个题目&#xff0c;在A[N]字符串数组中匹配长度为M的字符串&…...

3.27浮点数计算

-127就是说&#xff0c;有8位的数来表示指数&#xff0c;然后给他减去127就是这八位劈半&#xff0c;一半表示负数的指数&#xff0c;一半表示整数的指数&#xff1b;对于移码来说&#xff0c;最高位为1时表示为正&#xff0c;为0时表示为负 对阶是要小阶向大阶对齐&#xff0c…...

存储过程与自然语言处理逻辑的不同与结合

在现代软件开发中&#xff0c;存储过程与自然语言处理&#xff08;NLP&#xff09;逻辑都发挥着重要作用。存储过程是一种在数据库内部运行的预编译程序&#xff0c;通常用于处理与数据相关的任务&#xff0c;例如插入、更新、删除数据以及复杂的查询操作。而自然语言处理&…...

数据集搜集器(百科)008

对数据集搜集器&#xff08;百科&#xff09;007进行一下改进&#xff1a; 错误处理&#xff1a;增加更多的错误处理&#xff0c;比如网络请求超时、解析错误等。 用户界面&#xff1a;增加一些提示信息&#xff0c;让用户更清楚当前的操作状态。 多线程处理&#xff1a;确保多…...

用Pycharm安装manim

由于版本和工具的差异&#xff0c;manim的安装方式不尽相同。本文用Pycharm来安装manim. 一、准备工作&#xff1a;安装相应版本的python、pycharm和ffmpeg. 此处提供一种安装ffmpeg的方式 下载地址&#xff1a;FFmpeg 下载后&#xff0c;解压到指定目录。 配置环境变量&am…...

HTB:Love[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机开放端口进行脚本、服务扫描 使用浏览器访问靶机443端口 尝试利用该功能访问靶机自身80端口 使用ffuf对靶机80端口进行路径FUZZ 漏洞利用 使用searchsploit搜索靶机80端…...

程序设计 26种设计模式,如何分类?

1. 创建型模式 (Creational Patterns) 这些模式关注如何实例化对象。它们通过各种方式封装对象的创建过程&#xff0c;从而提供灵活性和可扩展性。 单例模式 (Singleton)&#xff1a;确保某个类只有一个实例&#xff0c;并提供全局访问点。工厂方法模式 (Factory Method)&…...

Oracle对比表与表之间的结构

自己首先想到的就是,navicat有提供结构同步 但是有些时候情况不一样,比如我遇到的是连接不同,而且是互相同步,以最多的列的那个表为样 没有说一个固定的源 那么还可以通过导出表结构去另一个库中执行看是否报错,以此来判断结构的不同 但是我感觉有点儿麻烦 最后想到通过sql语…...

MySQL 查询 执行顺序

MySQL查询的执行顺序大致如下&#xff1a; FROM子句&#xff1a;确定要查询的表。 ON&#xff1a;对JOIN语句中的表进行关联条件指定。 JOIN&#xff1a;如果有的话&#xff0c;对表进行关联。 WHERE&#xff1a;对记录进行过滤。 GROUP BY&#xff1a;根据指定的列分组记录…...

Scala习题

姓名&#xff0c;语文&#xff0c;数学&#xff0c;英语 张伟&#xff0c;87&#xff0c;92&#xff0c;88 李娜&#xff0c;90&#xff0c;85&#xff0c;95 王强&#xff0c;78&#xff0c;90&#xff0c;82 赵敏&#xff0c;92&#xff0c;88&#xff0c;91 孙涛&#xff0c…...