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

Mnesia(三)

在表中保存复杂数据

Mnesia是被设计用来保存Erlang数据结构的。可以把任意类型的Erlang数据结构保存到Mnesia表中。

-export([init_mnesia_schema/0, start/0]).
-export([add_plans/0, get_plan/1]).
-include_lib("stdlib/include/qlc.hrl").
-record(shop, {item, quantity, cost}).
-record(cost, {name, price}).
-record(design, {id, plan}).%% 初始化 Mnesia 数据库模式和表
init_mnesia_schema() ->mnesia:create_schema([node()]),mnesia:start(),mnesia:create_table(shop, [{attributes, record_info(fields, shop)}]),mnesia:create_table(cost, [{attributes, record_info(fields, cost)}]),mnesia:create_table(design, [{attributes, record_info(fields, design)}]),mnesia:stop().%% 启动 Mnesia 并等待表格准备就绪
start() ->mnesia:start(),mnesia:wait_for_tables([shop, cost, design], 20000).add_plans() ->D1 = #design{id = {joe, 1}, plan = {circle, 10}},D2 = #design{id = {jane, 2}, plan = {square, 5}},D3 = #design{id = {john, {house, 23}},plan = {house,[{floor, 1, [{doors, 3}, {windows, 12}, {rooms, 5}]},{floor, 2, [{doors, 3}, {windows, 20}, {rooms, 8}]}]}},F = fun() ->mnesia:write(D1),mnesia:write(D2),mnesia:write(D3)end,mnesia:transaction(F).get_plan(Id) ->F = fun() ->mnesia:read({design, Id})end,mnesia:transaction(F).
2> c(test_mnesia).
{ok,test_mnesia}
3> test_mnesia:init_mnesia_schema().
stopped
4>
=INFO REPORT==== 4-Dec-2024::21:46:30 ===application: mnesiaexited: stoppedtype: temporary
4> test_mnesia:start().              
ok
5> test_mnesia:add_plans().
{atomic,ok}
6> test_mnesia:get_plan({joe,1}). 
{atomic,[{design,{joe,1},{circle,10}}]}
7> test_mnesia:get_plan({john,{house,23}}). 
{atomic,[{design,{john,{house,23}},{house,[{floor,1,[{doors,3},{windows,12},{rooms,5}]},{floor,2,[{doors,3},{windows,20},{rooms,8}]}]}}]}

Mnesia数据库与Erlang编程语言的数据结构之间没有太多的“适配障碍”。也就是说,你可以在数据库中存储任何类型的Erlang数据结构,比如列表、元组、记录等,并且向数据库中添加或删除这些复杂的数据结构非常迅速、方便。

这个特点让Mnesia非常灵活,开发者可以直接在数据库中使用和操作自己熟悉的Erlang数据结构,而无需担心转换或适配的麻烦。这使得在数据库中管理复杂的数据变得更加高效和自然。

表的类型和位置

Mnesia 数据表的选择和配置需要根据应用场景的需求进行合理设计。

  • 内存表(RAM Table)以其极高的性能适用于对速度要求极高的场景,但由于数据是瞬态的,一旦系统崩溃或重启,所有数据会丢失。因此,在使用内存表之前,必须确保系统的物理内存足够大,以避免操作系统使用虚拟内存(swap)导致性能急剧下降。此外,还需要考虑数据丢失是否可以接受,如果数据丢失是不可接受的,那么应当考虑在本机或其他机器上进行备份。

  • 磁盘表(Disk Table)则提供了数据的持久性,系统崩溃时数据不会丢失,前提是磁盘本身没有物理损坏。磁盘表的实现机制是,在每次事务提交时,数据会先写入磁盘日志,日志定期同步到数据表。当系统重启时,未同步的数据会通过日志恢复。这种机制保证了数据持久化,但如果系统在事务提交前崩溃,尚未写入日志的数据将会丢失。因此,对于磁盘表来说,确保数据安全的唯一风险是系统崩溃发生在事务提交过程中的那一刻。

在实际应用中,为了平衡性能和数据的持久性,混合存储(RAM + Disk)是一个常见选择。通过将数据同时存储在内存和磁盘中,既能提供较高的性能,又能保证数据在系统崩溃时不丢失。而备份策略则是确保数据安全的另一个重要措施,尤其是在高可用场景下,可以选择将数据表备份到其他机器上,以提高数据的可恢复性。最终,选择何种存储方式应根据数据的重要性、性能要求和系统的可靠性需求来决定。

创建表

mnesia:create_table/2 函数用于在 Mnesia 中创建一个新的数据表。它的参数是两个部分:表名(Name)和表的配置参数(Args)。参数如下:

  1. Name:表名,通常是一个原子(atom),用于标识数据表。它必须是一个唯一的名称。例如,my_table、user_data 等。

  2. Args:一个包含表配置的列表,它指定了该表的属性和行为。这个参数是一个包含关键字选项的列表,可以包括以下几个常见的配置选项:

  • ram_copies:指定表数据应该存储在内存中,适用于快速访问,但数据在节点崩溃后会丢失。它的值是一个节点名的列表,表示哪些节点上的 Mnesia 实例将存储该表的数据。

  • disc_copies:指定表数据应该存储在磁盘上,数据持久化,系统崩溃时不丢失。其值是一个节点名的列表,表示哪些节点上的 Mnesia 实例将存储该表的数据,数据存储在磁盘上。

  • disc_only_copies:指定表的数据仅存储在磁盘上,且不会加载到内存中。适用于需要持久化数据,但不频繁访问的场景。

  • type:指定表的类型。可以是 set、ordered_set 或 bag。其中:

    • set 表示每个键在表中只能出现一次;
    • ordered_set 表示数据会按照插入顺序进行排序;
    • bag 表示允许相同的键出现多次。
  • index:为表创建索引,优化特定字段的查询。它的值是一个字段名或字段名列表。为指定的字段创建索引,查询时可以加速该字段的检索。

  • record_name:指定该表所使用的记录(record)类型的名称。一般情况下,如果使用结构化数据存储(例如使用 #person{name, age} 这种格式),record_name 用于指定记录的名称。

  • ram_node:指定将表的数据存储在内存中,并将该数据存储节点分配到某些特定的节点。如果没有指定,Mnesia 会根据系统自动选择合适的节点。

  • disc_node:指定将表的数据存储在磁盘上,并将该数据存储节点分配到某些特定的节点。

举例:
用于获取与记录相关的信息,使用语法{attribute,record_info(fields,xxx)},而不需要显式的逐个字段的指定列名。
使用Attrs代替{attribute,record_info(fields,xxx)}

mnesia:create_table(shop, [Attrs])

  • 只在一个节点的内存中存储。
  • 如果这个节点失效,表中的数据都会丢失。
  • 在所有的方法中,这是最快的组合。
  • 机器的物理内存要能放下整张表。

mnesia:create_table(shop,[Attrs,{disc_copies,[node()]}])

  • 在一个节点上做内存+磁盘备份。
  • 如果节点失效,表中的数据可以从磁盘上恢复。
  • 读操作很快,写操作稍慢。
  • 机器的物理内存要能放下整张表。

mnesia:create_table(shop,[Attrs,{disc_only_copies, [node()]}])

  • 单个节点的磁盘备份。
  • 无须考虑内存大小,可以存储大量数据。
  • 比用内存备份的方式要慢一些。

mnesia:create_table(shop,[Attrs,{ram_copies,[node(),someOtherNode()]})

  • 这个表在两个节点上有内存备份。
  • 如果两个节点都失效了,数据会丢失。
  • 机器的物理内存要能放下整张表。
  • 在两个节点上都能访问这个表。

mnesia:create_table(shop,[Attrs, {disc_copies, [node(),someOtherNode()]}])

  • 两个节点上都做磁盘备份。
  • 每个节点上都可以进行恢复。
  • 两个节点都失效,仍然可以恢复。

当一个表在多个Erlang节点上备份时,它会尽可能的进行同步。如果某个节点失效,系统会继续保持运作,但是少了一个备份。当失效的节点再次上线时,它会与其他节点再次进行同步,备份数量得以保持。

备份和恢复

Mnesia 提供了一些和备份相关的配置选项,以下是一些常见的配置:

  1. {dump_log_write_threshold, N}
    该配置项设置 Mnesia 在写入日志文件前,最多积累多少个事务。Mnesia 使用事务日志来保证数据一致性和持久性。N 是一个整数值,表示日志文件的写入阈值。
    例如:
    {dump_log_write_threshold, 1000}.

  2. {backup_log, true}
    该配置项决定是否启用事务日志的备份。启用后,Mnesia 会定期将事务日志的副本保存到磁盘,确保即使在系统崩溃后也能够恢复数据。

  3. {auto_backup, true}
    设置此选项为 true,Mnesia 会自动定期备份数据库。可以通过配置备份的频率和策略来自动执行备份操作,确保定期保存数据库的状态。

  4. {disc_only_copies, [node()]}
    这个配置项决定数据是否仅存储在磁盘上。对于需要备份的表,可以通过设置为 disc_only_copies 来指定数据将被持久化到磁盘,而不保留在内存中。
    这种存储方式适用于数据量大、更新不频繁的场景,通常适合备份和恢复操作。

  5. {ram_copies, [node()]}
    与 disc_only_copies 相反,ram_copies 配置项决定数据是否仅存储在内存中。数据存储在内存中时,可以提供更高的访问性能,但在系统崩溃时无法持久化。
    为了备份和恢复,通常使用 disc_only_copies,但在某些高性能要求的场景下,可以选择 ram_copies。

  6. mnesia:backup/1 和 mnesia:restore/1 函数
    备份:mnesia:backup/1 函数可以将 Mnesia 数据库的内容备份到指定的文件。
    恢复:mnesia:restore/1 函数可以从备份文件恢复数据库。
    示例:
    备份数据库:mnesia:backup("backup_file").
    恢复数据库:mnesia:restore("backup_file").

  7. mnesia:load_table/2 和 mnesia:dump_table/2 函数
    mnesia:load_table/2 和 mnesia:dump_table/2 函数允许你在运行时备份和恢复单个表。
    备份表:mnesia:dump_table(shop, "shop_backup").
    恢复表:mnesia:load_table(shop, "shop_backup").

相关文章:

Mnesia(三)

在表中保存复杂数据 Mnesia是被设计用来保存Erlang数据结构的。可以把任意类型的Erlang数据结构保存到Mnesia表中。 -export([init_mnesia_schema/0, start/0]). -export([add_plans/0, get_plan/1]). -include_lib("stdlib/include/qlc.hrl"). -record(shop, {ite…...

ELK的Filebeat

目录 传送门前言一、概念1. 主要功能2. 架构3. 使用场景4. 模块5. 监控与管理 二、下载地址三、Linux下7.6.2版本安装filebeat.yml配置文件参考(不要直接拷贝用)多行匹配配置过滤配置最终配置(一、多行匹配、直接读取日志文件、EFK方案&#…...

【WPF中ControlTemplate 与 DataTemplate之间的区别?】

前言 WPF中ControlTemplate 与 DataTemplate之间的区别? 1. 定义: ControlTemplate 是用于定义 WPF 控件的外观和结构的模板。它允许您重新定义控件的视觉表现,而不改变控件的行为。 DataTemplate 是用于定义如何呈现数据对象的模板。它通…...

FFmpeg源码中,计算CRC校验的实现

一、CRC简介 CRC(Cyclic Redundancy Check),即循环冗余校验,是一种根据网络数据包或电脑文件等数据产生简短固定位数校核码的快速算法,主要用来检测或校核数据传输或者保存后可能出现的错误。CRC利用除法及余数的原理,实现错误侦…...

js面试题

面试题:说一下call、apply、bind区别 共同点:功能一致 可以改变this指向 语法:函数.call() 函数.apply() 函数.bind() 区别:1.call、apply可以立即执行。bind不会立即执行,因为bind返回的是一个函数需要加入&#xff…...

Python酷库之旅-第三方库Pandas(255)

目录 一、用法精讲 1206、pandas.tseries.offsets.SemiMonthEnd.is_on_offset方法 1206-1、语法 1206-2、参数 1206-3、功能 1206-4、返回值 1206-5、说明 1206-6、用法 1206-6-1、数据准备 1206-6-2、代码示例 1206-6-3、结果输出 1207、pandas.tseries.offsets.S…...

STM32 进阶 定时器3 通用定时器 案例2:测量PWM的频率/周期

需求分析 上一个案例我们输出了PWM波,这个案例我们使用输入捕获功能,来测试PWM波的频率/周期。 把测到的结果通过串口发送到电脑,检查测试的结果。 如何测量 1、输入捕获功能主要是:测量输入通道的上升沿和下降沿 2、让第一个…...

【计算机网络】实验10:开放最短路径优先OSPF

实验10 开放最短路径优先OSPF 一、实验目的 本实验的主要目的是验证OSPF(开放最短路径优先)协议的作用,深入理解其在动态路由中的重要性。通过实验,我们将观察OSPF如何在网络中高效地传播路由信息,从而实现不同网络之…...

线程信号量 Linux环境 C语言实现

既可以解决多个同类共享资源的互斥问题&#xff0c;也可以解决简易的同步问题 头文件&#xff1a;#include <semaphore.h> 类型&#xff1a;sem_t 初始化&#xff1a;int sem_init(sem_t *sem, int pshared, unsigned int value); //程序中第一次对指定信号量调用p、v操…...

Tree搜索二叉树、map和set_数据结构

数据结构专栏 如烟花般绚烂却又稍纵即逝的个人主页 本章讲述数据结构中搜索二叉树与HashMap的学习&#xff0c;感谢大家的支持&#xff01;欢迎大家踊跃评论&#xff0c;感谢大佬们的支持! 目录 搜索二叉树的概念二叉树搜索模拟实现搜索二叉树查找搜索二叉树插入搜索二叉树删除…...

Linux-GPIO应用编程

本章介绍应用层如何控制 GPIO&#xff0c;譬如控制 GPIO 输出高电平、或输出低电平。 只要是用到GPIO的外设&#xff0c;都有可能用得到这些操作方法。 照理说&#xff0c;GPIO的操作应该是由驱动层去做的&#xff0c;使用寄存器操作或者GPIO子系统之类的框架。 但是&#xff0…...

【模板】排序(py)/ 【深基9.例4】求第 k 小的数

题目描述 将读入的 NN 个数从小到大排序后输出。 输入格式 第一行为一个正整数 NN。 第二行包含 NN 个空格隔开的正整数 aiai​&#xff0c;为你需要进行排序的数。 输出格式 将给定的 NN 个数从小到大输出&#xff0c;数之间空格隔开&#xff0c;行末换行且无空格。 输…...

Linux获取文件属性

目录 stat函数 获取文件属性 获取文件权限 实现“head -n 文件名”命令的功能 编程实现“ls -l 文件名”功能 stat/fstat/lstat的区别&#xff1f; stat函数 int stat(const char *path, struct stat *buf); 功能&#xff1a;获取文件属性 参数&#xff1a; path&…...

一文说清:Git创建仓库的方法

0 引言 本文介绍如何创建一个 Git 本地仓库&#xff0c;以及与远程仓库的关联。 1 初始化仓库&#xff08;git init&#xff09; 1.1 概述 Git 使用 git init 命令来初始化一个 Git 仓库&#xff0c;Git 的很多命令都需要在 Git 的仓库中运行&#xff0c;所以 git init 是使…...

ASP.NET Core 负载/压力测试

文章目录 一、第三方工具二、使用发布版本进行负载测试和压力测试 负载测试和压力测试对于确保 web 应用的性能和可缩放性非常重要。 尽管负载测试和压力测试的某些测试相似&#xff0c;但它们的目标不同。 负载测试&#xff1a;测试应用是否可以在特定情况下处理指定的用户负…...

红日靶场vulnstack (五)

前言 好久没打靶机了&#xff0c;今天有空搞了个玩一下&#xff0c;红日5比前面的都简单。 靶机环境 win7&#xff1a;192.168.80.150(外)、192.168.138.136(内) winserver28&#xff08;DC&#xff09;&#xff1a;192.168.138.138 环境搭建就不说了&#xff0c;和之前写…...

k8s,声明式API对象理解

命令式API 比如&#xff1a; 先kubectl create&#xff0c;再replace的操作&#xff0c;我们称为命令式配置文件操作 kubectl replace的执行过程&#xff0c;是使用新的YAML文件中的API对象&#xff0c;替换原有的API对象&#xff1b;而kubectl apply&#xff0c;则是执行了一…...

【人工智能】用Python和Scikit-learn构建集成学习模型:提升分类性能

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 集成学习(Ensemble Learning)是通过组合多个弱学习器提升模型性能的机器学习方法,广泛应用于分类、回归及其他复杂任务中。随机森林(Random Forest)和梯度提升(Gradient Boosting)是集成学习的两种…...

MSBUILD : error MSB1009: 项目文件不存在。

环境&#xff1a;win10 vscode1.95.3 clang15.0.4 问题&#xff1a;最近用vscodecmakeclang在windows上编译c项目&#xff0c;用mingw32不报错&#xff0c;用clang报错,错误如下&#xff0c; MSBUILD : error MSB1009: 项目文件不存在。 原因&#xff1a;与其他生成器(如Mak…...

洛谷P1827 [USACO3.4] 美国血统 American Heritage(c嘎嘎)

题目链接&#xff1a;P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 题目难度&#xff1a;普及 首先介绍下二叉树的遍历&#xff1a; 学过数据结构都知道二叉树有三种遍历&#xff1a; 1.前序遍历&#xff1a;根左右 2.中序遍历&#xff1a;左根…...

YOLOv8模型pytorch格式转为onnx格式

一、YOLOv8的Pytorch网络结构 model DetectionModel((model): Sequential((0): Conv((conv): Conv2d(3, 64, kernel_size(3, 3), stride(2, 2), padding(1, 1))(act): SiLU(inplaceTrue))(1): Conv((conv): Conv2d(64, 128, kernel_size(3, 3), stride(2, 2), padding(1, 1))(a…...

工业—使用Flink处理Kafka中的数据_ProduceRecord1

1 、 使用 Flink 消费 Kafka 中 ProduceRecord 主题的数据&#xff0c;统计在已经检验的产品中&#xff0c;各设备每 5 分钟 生产产品总数&#xff0c;将结果存入Redis 中&#xff0c; key 值为 “totalproduce” &#xff0c; value 值为 “ 设备 id &#xff0c;最近五分钟生…...

RNACOS:用Rust实现的Nacos服务

RNACOS是一个使用Rust语言开发的Nacos服务实现&#xff0c;它继承了Nacos的所有核心功能&#xff0c;并在此基础上进行了优化和改进。作为一个轻量级、快速、稳定且高性能的服务&#xff0c;RNACOS不仅包含了注册中心、配置中心和Web管理控制台的功能&#xff0c;还支持单机和集…...

响应式编程一、Reactor核心

目录 一、前置知识1、Lambda表达式2、函数式接口 Function3、StreamAPI4、Reactive-Stream1&#xff09;几个实际的问题2&#xff09;Reactive-Stream是什么&#xff1f;3&#xff09;核心接口4&#xff09;处理器 Processor5&#xff09;总结 二、Reactor核心1、Reactor1&…...

聚簇索引与非聚簇索引

目录 一、聚簇索引&#xff08;Clustered Index&#xff09; 二、非聚簇索引&#xff08;Non-Clustered Index&#xff09; 三、示例说明 一、聚簇索引&#xff08;Clustered Index&#xff09; 定义&#xff1a; 聚簇索引是一种将数据存储和索引合为一体的索引方式。 表中…...

鸿蒙 Next 可兼容运行 Android App,还支持出海 GMS?

最近 「出境易」和 「卓易通」 应该算是鸿蒙和 Android 开发圈“突如其来”的热门话题&#xff0c;而 「出境易」可能更高频一些&#xff0c;主要也是 Next 5.0 被大家发现刚上架了一个名为「出境易」的应用&#xff0c;通过这个 App 用户可以直接运行不兼容 Next 的 Android A…...

opencv常用图像处理操作

OpenCV 处理图像的通用流程通常包括以下几个步骤&#xff0c;根据具体需求可以调整或跳过某些步骤。以下是一个通用的框架&#xff1a; 读取图像 加载图像文件到内存中以进行后续处理。 import cv2 读取图像 image cv2.imread(‘image.jpg’) # 彩色图像 gray_image cv2…...

<三>51单片机PWM开发SG90和超声测距

目录 1,PWM开发SG90 1.1简介 1.2控制舵机 1.3编程实现 2,超声测距 2.1简介 2.2,超声波测距代码实现 1,PWM开发SG90 1.1简介 PWM&#xff0c;英文名Pulse Width Modulation&#xff0c;是脉冲宽度调制缩写&#xff0c;它是通过对一系列脉冲的宽度进 行调制&#xff0c;等…...

如何加强游戏安全,防止定制外挂影响游戏公平性

在现如今的游戏环境中&#xff0c;外挂始终是一个困扰玩家和开发者的问题。尤其是定制挂&#xff08;Customized Cheats&#xff09;&#xff0c;它不仅复杂且隐蔽&#xff0c;更能针对性地绕过传统的反作弊系统&#xff0c;对游戏安全带来极大威胁。定制挂通常是根据玩家的需求…...

《矿物学报》

1 简介 《矿物学报》由中国科学院地球化学研究所和中国矿物岩石地球化学学会联合主办&#xff0c;1981年创刊&#xff0c;目前是双月刊&#xff0c;国内外公开发行。主要报道矿物学及相关学科的高水平研究成果&#xff0c;矿物学研究的现状综述和动态分析&#xff0c;以及国内…...

如何将快捷指令添加到启动台

如何将快捷指令添加到启动台/Finder/访达&#xff08;Mac&#xff09; 1. 打开快捷指令创建快捷指令 示例创建了一个文件操作测试的快捷指令。 2. 右键选择添加到程序坞 鼠标放在待添加的快捷指令上。 3. 右键添加到访达 鼠标放在待添加的快捷指令上。 之后就可以在启…...

Python NumPy学习指南:从入门到精通

Python NumPy学习指南&#xff1a;从入门到精通 第一部分&#xff1a;NumPy简介与安装 1. 什么是NumPy&#xff1f; NumPy&#xff0c;即Numerical Python&#xff0c;是Python中最为常用的科学计算库之一。它提供了强大的多维数组对象ndarray&#xff0c;并支持大量的数学函…...

rabbitmq 安装延时队列插件rabbitmq_delayer_message_exchange(linux centOS 7)

1.插件版本 插件地址&#xff1a;Community Plugins | RabbitMQ rabbitmq插件需要对应的版本&#xff0c;根据插件地址找到插件 rabbitmq_delayer_message_exchange 点击Releases 因为我rabbitmq客户端显示的版本是&#xff1a; 所以我选择插件版本是&#xff1a; 下载 .ez文…...

【C++】new与malloc、三种传参、函数重载及内联函数

一、new-delete以及malloc-freequbie 1.new&#xff1a; &#xff08;1&#xff09;运算符&#xff0c;没有返回值概念&#xff0c;但开出来空间有类型&#xff0c;不需要设置大小 &#xff08;2&#xff09;可以在堆区动态开辟空间&#xff0c;并且可以默认执…...

C语言实例_23之计算阶乘和(5!+4!+…+1!)

1. 题目 计算阶乘和(5! 4! … 1!)&#xff0c;即先分别计算出从1到5每个数的阶乘&#xff0c;再将这些阶乘值进行累加求和。 2. 阶乘概念及分析 实现主要是迭代和递归&#xff1a; - 迭代实现思路&#xff1a; - 可以通过两层循环来实现&#xff0c;外层循环控制数字从5到…...

zotero中pdf-translate插件和其他插件的安装

1.工具–》插件 2.找插件 3.点击之后看到一堆插件 4.找到需要的&#xff0c;例如pdf-translate 5.点击进入&#xff0c;需要看一下md文档了解下&#xff0c;其实最重要的就是找到特有的(.xpi file) 6.点击刚刚的蓝色链接 7.下载并保存xpi文件 8.回到zotero&#xff0c;安装并使…...

【Linux系统编程】——理解冯诺依曼体系结构

文章目录 冯诺依曼体系结构硬件当代计算机是性价比的产物冯诺依曼的存储冯诺依曼的数据流动步骤冯诺依曼结构总结 冯诺依曼体系结构硬件 下面是整个冯诺依曼体系结构 冯诺依曼结构&#xff08;Von Neumann Architecture&#xff09;是现代计算机的基本结构之一&#xff0c;由数…...

C++中实现多态有几种方式

一&#xff09;虚函数&#xff08;Virtual Functions&#xff09;实现多态 概念&#xff1a; 虚函数是在基类中使用关键字virtual声明的成员函数。当一个类包含虚函数时&#xff0c;编译器会为该类创建一个虚函数表&#xff08;v - table&#xff09;&#xff0c;这个表存储了虚…...

WPF+MVVM案例实战与特效(三十四)- 日志管理:使用 log4net 实现高效日志记录

文章目录 1、概述2、日志案例实现1、LogHelper 类详解2、代码解释3、配置文件4、实际应用案例场景 1:记录系统运行日志场景 2:记录数据库操作日志场景 3:记录 HTTP 请求日志5、总结1、概述 在WPF软件开发中,良好的日志记录机制对于系统的调试、维护和性能优化至关重要。lo…...

AI与低代码技术融合:如何加速企业智能化应用开发?

引言 随着全球数字化转型的步伐加快&#xff0c;企业在智能化应用开发方面面临着前所未有的挑战和机遇。传统的软件开发方式往往需要大量的技术人员、时间和资源&#xff0c;而在瞬息万变的市场环境中&#xff0c;这种模式显得效率低下且难以满足企业快速迭代和创新的需求。 与…...

git常用操作

通过分支src_br开发合并代码 在remote网页端从master分支创建一个src_br(master为合并代码的target分支)本地git仓库更新代码 git pull 切换到src_br分支 git checkout src_br 同步master分支的代码 git rebase master or git merge master or git cherry-pick commit-id…...

DVWA 靶场 SQL 注入报错 Illegal mix of collations for operation ‘UNION‘ 的解决方案

在 dvwa 靶场进行联合 SQL 注入时&#xff0c;遇到报错 Illegal mix of collations for operation UNION报错如下图&#xff1a; 解决办法&#xff1a; 找到文件MySQL.php 大致位置在dvwaincludesDBMS 目录下 使用编辑器打开 检索$create_db 第一个就是 在{$_DVWA[ ‘db_d…...

单片机的基本构成与工作原理

单片机&#xff0c;即微控制器&#xff08;Microcontroller Unit&#xff0c;MCU&#xff09;&#xff0c;是一种将中央处理器(CPU)、存储器(ROM/RAM)、定时/计数器(Timer/Counter)、中断系统、输入输出(I/O)接口等集成在一块芯片上的微型计算机。它具有体积小、功耗低、成本低…...

qt QSettings详解

1、概述 QSettings是Qt框架中用于应用程序配置和持久化数据的一个类。它提供了一种便捷的方式来存储和读取应用程序的设置&#xff0c;如窗口大小、位置、用户偏好等。QSettings支持多种存储格式&#xff0c;包括INI文件、Windows注册表&#xff08;仅限Windows平台&#xff0…...

微信小程序全屏显示地图

微信小程序在界面上显示地图&#xff0c;只需要用map标签 <map longitude"经度度数" latitude"纬度度数"></map>例如北京的经纬度为&#xff1a;116.407004,39.904595 <map class"bgMap" longitude"116.407004" lati…...

【Linux课程学习】:文件第二弹---理解一切皆文件,缓存区

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 Linux学习笔记&#xff1a; https://blog.csdn.net/d…...

浅谈CI持续集成

1.什么是持续集成 持续集成&#xff08;Continuous Integration&#xff09;&#xff08;CI&#xff09;是一种软件开发实践&#xff0c;团队成员频繁地将他们的工作成果集成到一起(通常每人每天至少提交一次&#xff0c;这样每天就会有多次集成)&#xff0c;并且在每次提交后…...

微信创建小程序码 - 数量不受限制

获取小程序码&#xff1a;小程序码为圆图&#xff0c;且不受数量限制。 目录 文档 接口地址 请求方式 功能描述 注意事项 获取 scene 值 请求参数 返回参数 对接 请求方法 获取小程序码 调用获取小程序码 总结 文档 接口地址 https://api.weixin.qq.com/wxa/get…...

基于 Elasticsearch Completion Suggester 实现高效搜索智能提示

1. 引言 在现代搜索引擎中&#xff0c;搜索智能提示已成为提升用户体验的重要功能之一。无论是电商网站、内容管理平台&#xff0c;还是社交媒体应用&#xff0c;智能提示都能帮助用户快速输入关键字、发现相关内容&#xff0c;并减少拼写错误带来的困扰。 1.1 什么是搜索智能…...

框架建设实战1——创建frame-parent

结合框架的结构&#xff0c;首先我们创建所以使用框架的parent&#xff0c;用以自顶向下的框架组件管理。 本框架基于maven进行依赖管理。具体步骤如下&#xff1a; 1.创建一个module 创建一个maven工程。命名为frame-parent。只有一个pom文件。文件内容主要包含&#xff1a;…...