SQLite使用的临时文件(二)

返回:SQLite—系列文章目录   

上一篇:SQLite数据库文件损坏的可能几种情况

下一篇:未发表 

​ 1. 引言

SQLite的显着特点之一它是一个数据库由一个磁盘文件组成。 这简化了 SQLite 的使用,因为移动或备份 数据库就像复制单个文件一样简单。它还使 SQLite适合用作应用程序文件格式。 但是,当一个完整的数据库保存在单个磁盘文件中时, SQLite确实在处理数据库的过程。

本文介绍SQLite的各种临时文件创建和使用。它描述了何时创建文件,何时它们被删除,它们的用途,为什么它们很重要, 以及如何在创建临时文件的系统上避免它们陷阱。

不考虑SQLite使用临时文件的方式 SQLite与应用程序签订的合约的一部分。这 本文档中的信息是对如何操作的正确描述 SQLite在编写本文档时或最后编写时运行更新。但是不能保证SQLite的未来版本 将以相同的方式使用临时文件。新型临时可能会使用文件,并且一些当前的临时文件使用可能会停止在SQLite 的未来版本中。

2. 九种临时文件

SQLite目前使用九种不同类型的临时文件:

  1. 回滚日志
  2. 超级期刊
  3. 预写日志 (WAL) 文件
  4. 共享内存文件
  5. 报表日记帐
  6. TEMP 数据库
  7. 视图和子查询的具体化
  8. 瞬态指数
  9. VACUUM 使用的瞬态数据库

有关每个这些临时文件类型的附加信息 在续集中。

2.1. 回滚日志

回滚日志是用于实现的临时文件 SQLite中的原子提交和回滚功能。(有关其工作原理的详细讨论,请参阅 标题为 Atomic Commit In SQLite 的单独文档。 回滚日志始终位于同一目录中作为数据库文件,并且与数据库同名文件,但附加了 8 个字符的“-journal”除外。 回滚日志通常在事务发生时创建首先启动,通常在事务时被删除 提交或回滚。 回滚日志文件对于实现 SQLite的原子提交和回滚功能。没有 回滚日志,SQLite 将无法回滚 事务不完整,以及是否发生崩溃或断电在事务过程中,整个数据库可能会在没有回滚日志的情况下损坏。

回滚日志通常在事务的开始和结束。但也有例外到这个规则。

如果在交易过程中发生崩溃或断电, 然后,回滚日志文件将保留在磁盘上。下次 另一个应用程序尝试打开数据库文件,它注意到 被遗弃的回滚日志的存在(我们称之为“热 journal“,并使用 日志将数据库还原到启动前的状态 未完成的交易。这就是SQLite的实现方式 原子提交。

如果应用程序使用 选项:

PRAGMA locking_mode=EXCLUSIVE;

SQLite 在第一个 独占锁定模式会话中的事务。但是在 事务结束时,它不会删除回滚 杂志。回滚日志可能被截断,或者其标头可能被截断 可能归零(取决于您使用的 SQLite 版本) 但不会删除回滚日志。回滚日志是 在退出独占访问模式之前不会删除。

回滚日志的创建和删除也会被journal_mode编译指示更改。 默认日记模式为 DELETE,这是默认行为 在每个事务结束时删除回滚日志文件, 如上所述。PERSIST 日志模式放弃删除 日志文件,而是覆盖回滚日志头 使用零,以防止其他进程回滚 日志,因此具有与删除日志文件相同的效果 无需实际从磁盘中删除文件的费用。在其他 words,日志模式 PERSIST 表现出与所见相同的行为 在 EXCLUSIVE 锁定模式下。这 OFF 日志模式会导致 SQLite 完全省略回滚日志。 换言之,如果日志模式为 设置为 OFF。 OFF 日志模式禁用原子 SQLite的提交和回滚功能。ROLLBACK 命令 设置了 OFF 日志模式时不可用。如果发生碰撞或电源 损失发生在使用 OFF 日志的事务中间 模式下,无法恢复,数据库文件可能会 去腐败。 MEMORY 日志模式导致回滚日志存储在内存而不是磁盘。ROLLBACK 命令在以下情况下仍然有效日志模式是 MEMORY,但因为磁盘上不存在 恢复、崩溃或断电 在使用 MEMORY 日志模式可能会导致数据库损坏。

2.2. 预写日志(WAL)文件

使用预写日志或 WAL 文件代替回滚日志 当 SQLite 在 WAL 模式下运行时。与回滚日志一样, WAL 文件的目的是实现原子提交和回滚。 WAL 文件始终位于同一目录中 作为数据库文件,并且与数据库同名 文件,但附加了 4 个字符“-wal”的文件除外。 WAL 文件是在首次连接到 数据库被打开,通常在最后 与数据库的连接将关闭。但是,如果最后一个连接 没有干净地关机,WAL文件将保留在文件系统中 并将在下次数据库时自动清理 打开。

2.3. 共享内存文件

在 WAL 模式下运行时,所有 SQLite 数据库连接都关联 使用相同的数据库文件需要共享一些用作 WAL 文件的索引。在大多数实现中,此共享内存是 通过在为此目的创建的文件上调用 mmap() 来实现: 共享内存文件。共享内存文件(如果存在)位于 与数据库文件位于同一目录中,并且与 数据库文件,但附加了 4 个字符“-shm”的除外。 共享内存文件仅在 WAL 模式下运行时存在。

共享内存文件不包含持久性内容。唯一的目的 的共享内存文件是提供共享内存块以供使用 通过多个进程在 WAL 模式下访问同一数据库。 如果 VFS 能够提供访问共享的替代方法 内存,则可以使用替代方法而不是 共享内存文件。例如,如果 PRAGMA locking_mode设置为 EXCLUSIVE(表示只有一个进程能够访问数据库 文件),则共享内存将从堆而不是从堆中分配 共享内存文件,而共享内存文件永远不会 创建。

共享内存文件与其关联的 WAL 文件具有相同的生存期。 共享内存文件是在创建 WAL 文件时创建的,并且是 删除 WAL 文件时删除。在 WAL 文件恢复期间, 共享内存文件是根据 正在恢复的 WAL 文件。

2.4. 超级日志文件

超级日志文件用作原子提交的一部分 当单个事务对多个事务进行更改时的处理 已使用 ATTACH 语句添加到单个数据库连接的数据库。超级日志文件始终是 与主数据库文件位于同一目录中 (主数据库文件是标识的数据库 在创建数据库连接的原始 sqlite3_open()、sqlite3_open16() 或 sqlite3_open_v2() 调用中) 带有随机后缀。超级日志文件包含 所有附加的辅助数据库的名称 在交易过程中已更改。多数据库 删除超级日志文件时提交事务。 请参阅标题为“在 SQLite 中进行原子提交”的文档。 其他细节。

如果没有超级日志,事务将提交到多数据库上 事务对于每个数据库都是原子的,但它 不会在所有数据库中都是原子的。换言之,如果 提交在中间因崩溃或断电而中断,然后 对其中一个数据库的更改可能会完成,而更改 可能会回滚到另一个数据库。超级期刊导致所有 将所有数据库中的更改进行回滚或一起提交。

超级日志文件仅用于以下 COMMIT 操作 涉及多个数据库文件,其中至少两个数据库 满足以下所有要求:

  1. 数据库由事务修改
  2. PRAGMA 同步设置未关闭
  3. PRAGMA journal_mode不是 OFF、MEMORY 或 WAL

这意味着 SQLite 事务不是原子的 跨多个数据库文件断电时,数据库 文件已关闭同步或使用日记时 OFF、MEMORY 或 WAL 模式。用于同步 OFF 和 journal_modes OFF 和 MEMORY,如果出现以下情况,数据库通常会损坏 事务提交因断电而中断。对于 WAL 模式,单个数据库文件以原子方式更新 在断电的情况下,但在多文件事务的情况下, 某些文件可能会回滚,而其他文件可能会在之后向前滚动 电源已恢复。

2.5. 报表日志文件

语句日志文件用于回滚 大型事务中的单个语句。例如,假设 UPDATE 语句将尝试修改数据库中的 100 行。 但是在修改前 50 行后,UPDATE 命中 约束冲突,应阻止整个语句。 语句日志用于撤消前 50 行更改 以便将数据库还原到开始时的状态 的声明。

仅为 UPDATE 或 INSERT 语句创建语句日记帐 这可能会更改数据库的多行,并且可能会命中 约束或触发器中的 RAISE 异常,因此需要 撤消部分结果。 如果 UPDATE 或 INSERT 不包含在 BEGIN 中...COMMIT 和 if 那么,同一数据库连接上没有其他活动语句 自 Ordinary 以来,没有创建任何报表日记 可以改用回滚日志。 如果替代冲突解决算法是 使用。例如:

UPDATE OR FAIL ...
UPDATE OR IGNORE ...
UPDATE OR REPLACE ...
UPDATE OR ROLLBACK ...
INSERT OR FAIL ...
INSERT OR IGNORE ...
INSERT OR REPLACE ...
INSERT OR ROLLBACK ...
REPLACE INTO ....

语句日记被赋予一个随机名称,不一定 在与主数据库相同的目录中,并且是自动的 在交易结束时删除。的大小 报表日记帐与实施的更改大小成正比 通过导致语句日志的 UPDATE 或 INSERT 语句 要创建。

2.6. TEMP数据库

使用“CREATE TEMP TABLE”语法创建的表仅 对数据库连接可见,其中“CREATE TEMP TABLE” 语句最初是计算的。这些 TEMP 表一起 与任何关联的索引、触发器和视图一起 存储在单独的临时数据库文件中,该文件创建为 一旦看到第一个“CREATE TEMP TABLE”语句。 这个单独的临时数据库文件还具有关联的 回滚日志。 删除用于存储 TEMP 表的临时数据库文件 当数据库连接关闭时自动 使用 sqlite3_close()。

TEMP 数据库文件与辅助数据库非常相似 使用 ATTACH 语句添加的文件,尽管有一些 特殊属性。 当数据库连接关闭时,始终会自动删除 TEMP 数据库。 TEMP 数据库始终使用 synchronous=OFF 和 journal_mode=PERSIST PRAGMA 设置。 而且,TEMP 数据库不能与 DETACH 一起使用,也不能 另一个进程 ATTACH TEMP 数据库。

与 TEMP 数据库关联的临时文件及其 仅当应用程序使用 “CREATE TEMP TABLE”语句。

2.7. 视图和子查询的具体化

包含子查询的查询有时必须计算 子查询分开,并将结果存储在临时 表,然后使用临时表的内容进行评估 外部查询。 我们称之为“物化”子查询。 SQLite 中的查询优化器试图避免实现, 但有时它并不容易避免。 通过具体化创建的临时表将分别存储 在他们自己单独的临时文件中,这是自动的 在查询结束时删除。 这些临时表的大小取决于 当然,数据在子查询的具体化中。

IN 运算符右侧的子查询必须经常 被物化。例如:

SELECT * FROM ex1 WHERE ex1.a IN (SELECT b FROM ex2);

在上面的查询中,将评估子查询“SELECT b FROM ex2” 其结果存储在一个临时表(实际上是一个临时表)中 index),允许确定值 ex2.b 使用简单的二进制搜索存在。构建此表后, 运行外部查询,并针对每个预期结果行进行检查 用于查看 ex1.a 是否包含在临时表中。 仅当 check 为 true 时,才会输出该行。

为了避免创建临时表,可能会重写查询 如下:

SELECT * FROM ex1 WHERE EXISTS(SELECT 1 FROM ex2 WHERE ex2.b=ex1.a);

最新版本的 SQLite(版本 3.5.4,2007-12-14)及更高版本) 将自动执行此重写 如果列 ex2.b 上存在索引。

如果 IN 运算符的右侧可以是值列表 如下所示:

SELECT * FROM ex1 WHERE a IN (1,2,3);

IN 右侧的列表值被视为 必须具体化的子查询。换言之, 上一个语句的行为好像是:

SELECT * FROM ex1 WHERE a IN (SELECT 1 UNION ALLSELECT 2 UNION ALLSELECT 3);

临时索引始终用于保存 IN 运算符的右侧,当该右侧 是值的列表。

子查询在出现时可能还需要具体化 在 SELECT 语句的 FROM 子句中。例如:

SELECT * FROM ex1 JOIN (SELECT b FROM ex2) AS t ON t.b=ex1.a;

根据查询,SQLite 可能需要实现 “(SELECT b FROM ex2)” 子查询到临时表中,然后 执行 ex1 和临时表之间的联接。这 查询优化器试图通过“扁平化”来避免这种情况 查询。在前面的示例中,查询可以扁平化, SQLite 会自动将查询转换为

SELECT ex1.*, ex2.b FROM ex1 JOIN ex2 ON ex2.b=ex1.a;

更复杂的查询可能会也可能不会使用查询 展平以避免临时表。无论是否 查询是否可以扁平化取决于以下因素:是否 或者子查询或外部查询是否包含聚合函数, ORDER BY 或 GROUP BY 子句、LIMIT 子句等。 查询何时可以和不能扁平化的规则是 非常复杂,超出了本文档的范围。

2.8. 瞬态指数

SQLite可以利用瞬态索引来 实现 SQL 语言功能,例如:

  • ORDER BY 或 GROUP BY 子句
  • 聚合查询中的 DISTINCT 关键字
  • 由 UNION、EXCEPT 或 INTERSECT 联接的复合 SELECT 语句

每个瞬态索引都存储在其自己的临时文件中。 暂时性索引的临时文件将自动删除 在使用它的语句的末尾。

SQLite努力使用预先存在的ORDER BY子句来实现 指数。如果已经存在适当的索引,SQLite 将行走 索引,而不是基础表,以提取 请求的信息,从而导致行出现在 所需的顺序。但是如果SQLite找不到合适的索引 它将评估查询并将每一行存储在瞬态索引中 其数据是行数据,其键是 ORDER BY 项。 评估查询后,SQLite 返回并遍历 从头到尾的瞬态索引,以便输出 按所需顺序排列的行。

SQLite 通过对 GROUP BY条款建议的顺序。每个输出行是 与前一个相比,看看它是否启动了一个新的“组”。 按 GROUP BY 术语排序的方式完全相同 作为按 ORDER BY 条款排序。使用预先存在的索引 如果可能,但如果没有合适的索引可用,则暂时性 索引已创建。

聚合查询上的 DISTINCT 关键字由 在临时文件中创建暂时性索引并存储 该索引中的每个结果行。计算新结果行时 进行检查以查看它们是否已存在于瞬态中 索引,如果这样做,则丢弃新的结果行。

复合查询的 UNION 运算符是通过创建 临时文件中的暂时性索引并存储结果 暂时索引中的左子查询和右子查询,丢弃 重复。在评估了两个子查询后, 瞬态索引从头到尾遍历以生成最终输出。

复合查询的 EXCEPT 运算符是通过创建 临时文件中的暂时性索引,用于存储 在此瞬态索引中左键查询,然后删除结果 从瞬态索引的右子查询,最后步行 索引从头到尾得到最终输出。

复合查询的 INTERSECT 运算符由 创建两个单独的瞬态索引,每个索引都位于单独的 临时文件。计算左侧和右侧子查询 每个都变成一个单独的瞬态索引。然后是两个指数 一起行走,并出现在两个索引中的条目 是输出。

请注意,复合查询的 UNION ALL 运算符不 单独使用瞬态索引(当然是正确的 UNION ALL 的左子查询可能使用瞬态索引 取决于它们的组成方式。

2.9. VACUUM使用的瞬态数据库

VACUUM 命令的工作原理是创建一个临时文件 然后将整个数据库重建为该临时数据库 文件。然后,将临时文件的内容复制回去 放入原始数据库文件中,临时文件是 删除。

由 VACUUM 命令创建的临时文件仅存在 在命令本身的持续时间内。临时的大小 文件不会比原始数据库大。

3. 编译时参数和编译SQLITE_TEMP_STORE

与事务控制关联的临时文件,即 回滚日志、超级日志、预写日志 (WAL) 文件、 和共享内存文件,始终写入磁盘。 但其他类型的临时文件可能存储在内存中 只有并且从未写入磁盘。 无论是否是回滚以外的临时文件, super 和语句日志写入磁盘或仅存储在内存中 取决于 SQLITE_TEMP_STORE编译时参数,temp_store Pragma, 以及临时文件的大小。

SQLITE_TEMP_STORE 编译时参数 #define 是一个值为 介于 0 和 3 之间的整数(含 0 和 3)。SQLITE_TEMP_STORE编译时参数的含义如下:

  1. 无论设置如何,临时文件始终存储在磁盘上 temp_store pragma。
  2. 默认情况下,临时文件存储在磁盘上,但这可以是 被 temp_store 编译指示覆盖。
  3. 默认情况下,临时文件存储在内存中,但这可以是 被 temp_store 编译指示覆盖。
  4. 无论设置如何,临时文件始终存储在内存中 temp_store pragma。

SQLITE_TEMP_STORE compile-time 参数的默认值为 1, 这意味着将临时文件存储在磁盘上,但提供选项 使用temp_store编译指示覆盖行为。

编译指示temp_store 一个整数值,该值也会影响存储位置的决策 临时文件。temp_store pragma 的值具有 含义如下:

  1. 根据确定,对临时文件使用磁盘或内存存储 通过 SQLITE_TEMP_STORE 编译时参数。
  2. 如果 SQLITE_TEMP_STORE compile-time 参数指定 临时文件,然后覆盖该决定并改用磁盘存储。 否则,请遵循 SQLITE_TEMP_STORE 编译时的建议 参数。
  3. 如果 SQLITE_TEMP_STORE compile-time 参数指定了 临时文件,然后覆盖该决定并改用内存存储。 否则,请遵循 SQLITE_TEMP_STORE 编译时的建议 参数。

temp_store 编译指示的默认设置为 0, 这意味着遵循SQLITE_TEMP_STORE编译时的建议 参数。

重申一下,SQLITE_TEMP_STORE compile-time 参数和仅temp_store编译指示 影响回滚日志以外的临时文件 和超级期刊。回滚日志和 超级日志始终写入磁盘,无论 SQLITE_TEMP_STORE 编译时参数和temp_store编译指示。

4. 其他临时文件优化

SQLite使用最近读取和写入的数据库的页面缓存 页面。此页面缓存不仅用于主数据库 文件,但也适用于暂时性索引和存储在临时 文件。如果 SQLite 需要使用临时索引或表,并且 SQLITE_TEMP_STORE 编译时参数和temp_store编译指示是 设置为在磁盘上存储临时表和索引,信息 最初仍存储在页面缓存的内存中。这 临时文件未打开,信息不真实 写入磁盘,直到页面缓存已满。

这意味着对于许多常见情况,临时表 索引很小(小到可以放入页面缓存) 不会创建临时文件,也不会发生磁盘 I/O。只 当临时数据变得太大而无法放入 RAM 时 信息溢出到磁盘。

每个临时表和索引都有其自己的页面缓存 可以存储确定的最大数据库页数 通过 SQLITE_DEFAULT_TEMP_CACHE_SIZE 编译时参数。 (默认值为 500 页。 页面缓存中的最大数据库页数为 每个临时表和索引都相同。该值不能 在运行时或按表或按索引进行更改。 每个临时文件都有自己的私有页面缓存,其 拥有SQLITE_DEFAULT_TEMP_CACHE_SIZE页数限制。

5. 临时文件存储位置

在其中创建临时文件的目录或文件夹是 由特定于操作系统的 VFS 确定。

在类 unix 系统上,按以下顺序搜索目录:

  1. PRAGMA temp_store_directory 或 sqlite3_temp_directory 全局变量设置的目录
  2. SQLITE_TMPDIR环境变量
  3. TMPDIR 环境变量
  4. /var/tmp
  5. /usr/tmp
  6. /tmp
  7. 当前工作目录 (“.”)

上述第一个被发现存在并具有写入和 使用 execute bits set。最后的“.”回退对某些人来说很重要 在 chroot 监狱中使用 SQLite 的应用程序没有 可用的标准临时文件位置。

在 Windows 系统上,按以下顺序搜索文件夹:

  1. PRAGMA temp_store_directory 或 sqlite3_temp_directory 全局变量设置的文件夹
  2. GetTempPath() 系统接口返回的文件夹。

SQLite本身并不关注环境变量 在这种情况下,尽管 GetTempPath() 系统调用可能是这样做的。 CYGWIN构建的搜索算法是不同的。选中 源代码了解详情。

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

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

相关文章

shell编程-jq命令详解

文章目录 前言一、jq简介1. 简介2. 语法3. 命令选项 二、用于处理json数据1. 过滤1.1 标识运算符1.2 基本过滤1.3 获取对象属性1.3 迭代数组元素1.4 获取数组元素1.5 使用运算符 2. 类型和值2.1 数组构造2.2 对象构造2.3 递归下降 3. 内置运算符和函数3.1 算术运算符3.2 函数3.…

PCL点云处理之最小中值平方(Lmeds法)拟合平面(二百三十四)

PCL点云处理之 最小中值平方法(Lmeds)拟合平面(二百三十四) 一、算法介绍一、拟合原理二、具体实现1.代码2.结果一、算法介绍 (本文提供详细注释,输出拟合平面参数和平面点云) Lmeds(Least Median of Squares)是一种统计学方法,用于拟合数据并减少异常值对拟合结果…

基础篇Redis

基础篇Redis 1.Redis简单介绍 Redis是一种键值型的NoSql数据库,这里有两个关键字: 键值型NoSql 其中键值型,是指Redis中存储的数据都是以key.value对的形式存储,而value的形式多种多样,可以是字符串.数值.甚至json…

前端-html-01

1.HTML的标签分类 1.1常用排版标签 标签名语义和功能属性单标签还是双标签h1 ~ h6一级标题~六级标题无双标签p段落无双标签hr分隔线无单标签br换行无单标签pre原格式显示无双标签div无语义&#xff0c;用于页面布局无双标签 1.1.1h标题标签 <!DOCTYPE html> <htm…

Redis I/O多路复用

I/O多路复用 Redis的I/o多路复用中&#xff0c;将多个连接放到I/O复用程序中&#xff0c;这个复用程序具体是什么&#xff0c;是Redis的主线程吗 在Redis的I/O多路复用机制中&#xff0c;“复用程序”实际上指的是操作系统提供的系统调用接口&#xff0c;如Linux下的epoll、sel…

ZYNQ学习之Ubuntu环境下的Shell与APT下载工具

基本都是摘抄正点原子的文章&#xff1a;<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 一、Ubuntu Shell操作 简单的说Shell 就是敲命令。国内把 Linux 下通过命令行输入命令叫…

如何本地搭建群晖虚拟机并实现无quickconnect服务环境远程访问

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

解密Google Cloud 全新 PaLM2及创新应用

&#x1f4f8;背景 因长期在大模型相关的部门工作&#xff0c;每天接收到很多和AI相关的信息&#xff0c;但小编意识到目前理解到的一些AI知识还有些片面。 恰逢稀土掘金开发者大会有谈到大模型相关的知识&#xff0c;于是借此机会&#xff0c;对大模型相关的一些知识再了解一…

【SpringCloud】探索Eureka注册中心

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 …

Protobuf基础使用

Protobuf是什么 在我们日常编写代码的过程中&#xff0c;经常会涉及到网络传输的部分。我们通常会在网络之间传递各种各样的请求&#xff0c;但是在我们日常架构之中&#xff0c;经常会涉及后端服务器之间的通信&#xff0c;通信过程中&#xff0c;可能传递的对象就是一个类。…

【vscode打开多文件夹】

1)将文件夹添加到工作空间中 2)文件夹方式展开 3)最终效果 小技巧&#xff1a; 文件夹的位置不对的话&#xff0c;可以拖动进行调整。

Linux--动静态库的原理和使用详解

本文介绍了Linux系统中动态库与静态库的概念、原理以及使用方法。通过深入讲解动态库与静态库的区别和优劣势&#xff0c;帮助读者更好地理解并选择合适的库类型来进行软件开发。 动态库和静态库的概念 动态库&#xff08;Dynamic Link Library&#xff0c;简称DLL&#xff09…

优化金融展厅设计,细节提升客户体验与实用效能

“很赚钱”大部分公众对金融行业的第一印象&#xff0c;这足以见得金融行业在社会经济发展中的重要性&#xff0c;而为了更好的宣传和科普金融相关信息&#xff0c;金融展厅的设计和建设成为了重要措施&#xff0c;它能够充分展示金融机构的实力、品牌形象和服务优势&#xff0…

Jmeter使用BeanShell保存数据到文件

1、目的 在使用jmeter压测时&#xff0c;业务上下连贯&#xff0c;需要对一些编号进行关联操作。这里使用‘JSON提取器’将值提取出来&#xff0c;后面请求可以直接使用。其它业务想要使用就只能把值保存到文件&#xff0c;再使用文件做参数化了。 2、JSON提取器 提取请求值 提…

网站监控工具必要的功能

什么是网站监控 网站监控是持续跟踪网站在互联网上的性能和可用性&#xff0c;以确保其正常运行并提供良好的用户体验的过程&#xff0c;在当今的数字时代&#xff0c;一个表现良好的网站对公司的声誉至关重要&#xff0c;打开速度慢的网站会对用户体验产生负面影响&#xff0…

leetcode 347.前K个高频元素

题目 思路 1.统计每个数出现的次数&#xff1a;可以用HashMap。key为num,value为这个数出现的次数。 2.怎样返回HashMap中value最大的前k个key呢&#xff1f; 这里用优先队列的方法&#xff08;本质是堆&#xff09; 我们要维护一个小根堆。我们在堆中存储&#xff08;key,…

APP信息收集思路总结(反代理,反虚拟机,反证书校验思路整理)

前言 本文是我在学习过程中的总结&#xff0c;希望可以被指导提议指正。 APP概况 app跟一个网站很像。 网站分为前端后端。 app就好像网站的前端一样&#xff0c;app不需要浏览器&#xff0c;而前端需要浏览器。 他们都需要服务器&#xff0c;也就是说&#xff0c;进行we…

实现登录拦截功能

1.4、实现登录拦截功能 温馨小贴士&#xff1a;tomcat的运行原理 当用户发起请求时&#xff0c;会访问我们像tomcat注册的端口&#xff0c;任何程序想要运行&#xff0c;都需要有一个线程对当前端口号进行监听&#xff0c;tomcat也不例外&#xff0c;当监听线程知道用户想要和…

#Linux(make工具和makefile文件以及makefile语法)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;make为编译辅助工具&#xff0c;解决用命令编译工程非常繁琐的问题 &#xff08;2&#xff09;在终端键入make即可调用make工具&#xff0…

huawei 华为 交换机 配置 LACP 模式的链路聚合示例 (交换机之间直连)

组网需求 如 图 3-22 所示&#xff0c; SwitchA 和 SwitchB 通过以太链路分别都连接 VLAN10 和 VLAN20 的网络&#xff0c;且SwitchA 和 SwitchB 之间有较大的数据流量。用户希望 SwitchA 和 SwitchB 之间能够提供较大的链路带宽来使相同VLAN 间互相通信。在两台 Switch 设备上…