Oracle 锁表的解决方法及避免锁表问题的最佳实践
背景介绍
在 Oracle 数据库中,锁表或锁超时相信大家都不陌生,是一个常见的问题,尤其是在执行 DML(数据操作语言)语句时。当一个会话对表或行进行锁定但未提交事务时,其他会话可能会因为等待锁资源而出现超时。这种情况不仅会影响数据库性能,还可能导致应用程序异常(java.sql.SQLException: Lock wait timeout exceeded)。
本文将详细介绍如何解决锁表问题以及如何查找引起锁表的 SQL 语句,并提供避免锁表问题的最佳实践。
锁表的原因
- 独占式封锁机制:Oracle 使用独占式封锁机制来确保数据的一致性。当一个会话对数据进行修改时,会对其加锁,直到事务提交或回滚。
- 长时间运行的 SQL 语句:某些 SQL 语句可能由于性能问题或其他原因而长时间运行,导致锁资源一直被占用。
- 高并发场景:在高并发环境下,多个会话同时访问相同的数据,可能会导致锁竞争,从而引发死锁。
解决锁表的方法
临时解决方案
-
找出锁资源竞争的会话
SELECT L.SESSION_ID, S.SERIAL#, L.LOCKED_MODE AS "锁模式", L.ORACLE_USERNAME AS "所有者", L.OS_USER_NAME AS "登录系统用户名", S.MACHINE AS "系统名", S.TERMINAL AS "终端用户名", O.OBJECT_NAME AS "被锁表对象名", S.LOGON_TIME AS "登录数据库时间"FROM V$LOCKED_OBJECT LINNER JOIN ALL_OBJECTS O ON O.OBJECT_ID = L.OBJECT_IDINNER JOIN V$SESSION S ON S.SID = L.SESSION_ID;
-
sql强制结束会话
ALTER SYSTEM KILL SESSION 'SESSION_ID, SERIAL#';
示例
假设 session1
修改了某条数据但未提交事务,session2
查询未提交事务的那条记录时会被阻塞。
-
查询未提交事务的会话信息
SELECT L.SESSION_ID, S.SERIAL#, L.LOCKED_MODE AS "锁模式", L.ORACLE_USERNAME AS "所有者", L.OS_USER_NAME AS "登录系统用户名", S.MACHINE AS "系统名", S.TERMINAL AS "终端用户名", O.OBJECT_NAME AS "被锁表对象名", S.LOGON_TIME AS "登录数据库时间"FROM V$LOCKED_OBJECT LINNER JOIN ALL_OBJECTS O ON O.OBJECT_ID = L.OBJECT_IDINNER JOIN V$SESSION S ON S.SID = L.SESSION_ID;SESSION_ID SERIAL# 锁模式 所有者 登录系统用户名 系统名 终端用户名 被锁表对象名 登录数据库时间 ---------- ------- ----- ------ ------------- ----- --------- --------- ------------ 29 84 3 IN test WORKGROUP\LA... LAPTOP-9FDC2903 LIN_USER 2023/2/26 11:08:08
-
强制结束
session1
ALTER SYSTEM KILL SESSION '29, 84';
-
验证
session2
的执行情况- 强制结束
session1
后,session2
的等待会立即终止并执行。
- 强制结束
查找被锁对象
-
查询被锁对象数目
SELECT COUNT(1) FROM V$LOCKED_OBJECT;
-
查询被锁对象
SELECT B.OWNER, B.OBJECT_NAME, A.SESSION_ID, A.LOCKED_MODEFROM V$LOCKED_OBJECT A, DBA_OBJECTS BWHERE B.OBJECT_ID = A.OBJECT_ID;
-
查询被锁对象的连接
SELECT T2.USERNAME, T2.SID, T2.SERIAL, T2.LOGON_TIMEFROM V$LOCKED_OBJECT T1, V$SESSION T2WHERE T1.SESSION_ID = T2.SIDORDER BY T2.LOGON_TIME;
-
关闭被锁对象连接
ALTER SYSTEM KILL SESSION '253, 9542';
查看当前系统中锁表情况
-
查询所有被锁对象
SELECT * FROM V$LOCKED_OBJECT;
-
查询详细的锁表情况
SELECT SESS.SID, SESS.SERIAL#, LO.ORACLE_USERNAME, LO.OS_USER_NAME, AO.OBJECT_NAME, LO.LOCKED_MODEFROM V$LOCKED_OBJECT LO, DBA_OBJECTS AO, V$SESSION SESS, V$PROCESS PWHERE AO.OBJECT_ID = LO.OBJECT_IDAND LO.SESSION_ID = SESS.SID;
查找引起锁表的 SQL 语句
-
查询引起锁表的 SQL 语句
SELECT L.SESSION_ID SID, S.SERIAL#, L.LOCKED_MODE, L.ORACLE_USERNAME, S.USER#, L.OS_USER_NAME, S.MACHINE, S.TERMINAL, A.SQL_TEXT, A.ACTIONFROM V$SQLAREA A, V$SESSION S, V$LOCKED_OBJECT LWHERE L.SESSION_ID = S.SIDAND S.PREV_SQL_ADDR = A.ADDRESSORDER BY SID, S.SERIAL#;
-
查看所有被阻塞的会话
SET LINE 200; COL TERMINAL FORMAT A10; COL PROGRAM FORMAT A20; COL USERNAME FORMAT A10; COL MACHINE FORMAT A10; COL SQL_TEXT FORMAT A40; SELECT A.SID, A.SERIAL#, A.USERNAME, A.COMMAND, A.LOCKWAIT, A.STATUS, A.MACHINE, A.TERMINAL, A.PROGRAM, A.SECONDS_IN_WAIT, B.SQL_TEXTFROM V$SESSION A, V$SQL BWHERE B.SQL_ID = A.SQL_IDAND (A.BLOCKING_INSTANCE IS NOT NULL AND A.BLOCKING_SESSION IS NOT NULL);
-
展示阻塞的树形结构
WITH lk AS (SELECT BLOCKING_INSTANCE || '.' || BLOCKING_SESSION AS blocker, INST_ID || '.' || SID AS waiterFROM GV$SESSIONWHERE BLOCKING_INSTANCE IS NOT NULL AND BLOCKING_SESSION IS NOT NULL ) SELECT LPAD(' ', 2 * (LEVEL - 1)) || WAITER LOCK_TREEFROM (SELECT * FROM lkUNION ALLSELECT DISTINCT 'root', BLOCKER FROM lkWHERE BLOCKER NOT IN (SELECT WAITER FROM lk)) CONNECT BY PRIOR WAITER = BLOCKER START WITH BLOCKER = 'root';
-
展示阻塞的树形结构,并输出阻塞语句、被阻塞语句,并给出杀会话语句
WITH lk AS (SELECT A.BLOCKING_INSTANCE || '.' || A.BLOCKING_SESSION AS blocker,A.INST_ID || '.' || A.SID AS waiter,(SELECT B.SQL_TEXT || ' ALTER SYSTEM KILL SESSION ''' || C.SID || ', ' || C.SERIAL# || ''''FROM GV$SQLAREA B, GV$SESSION CWHERE A.BLOCKING_INSTANCE = C.INST_IDAND C.SID = A.BLOCKING_SESSIONAND (C.SQL_ID = B.SQL_ID OR C.PREV_SQL_ID = B.SQL_ID)) AS kill_block_sql,(SELECT B.SQL_TEXT || ' ALTER SYSTEM KILL SESSION ''' || A.SID || ', ' || A.SERIAL# || ''''FROM GV$SQLAREA BWHERE A.INST_ID = B.INST_IDAND A.SQL_ID = B.SQL_ID) AS kill_waiter_sqlFROM GV$SESSION AWHERE A.BLOCKING_INSTANCE IS NOT NULL AND A.BLOCKING_SESSION IS NOT NULL ) SELECT LPAD(' ', 2 * (LEVEL - 1)) || WAITER || ' ' || KILL_WAITER_SQL LOCK_TREEFROM (SELECT BLOCKER, WAITER, KILL_WAITER_SQL FROM lkUNION ALLSELECT DISTINCT 'root', BLOCKER, KILL_BLOCK_SQL FROM lkWHERE BLOCKER NOT IN (SELECT WAITER FROM lk)) CONNECT BY PRIOR WAITER = BLOCKER START WITH BLOCKER = 'root';
-
直接显示阻塞关系
COL BLOCK_MSG FOR A80 SELECT C.TERMINAL || ' (''' || A.SID || ',' || C.SERIAL# || ''') is blocking ' || B.SID BLOCK_MSGFROM V$LOCK A, V$LOCK B, V$SESSION CWHERE A.ID1 = B.ID1AND A.ID2 = B.ID2AND A.BLOCK > 0AND A.SID <> B.SIDAND A.SID = C.SID;
避免锁表问题的最佳实践
1. 优化 SQL 语句
- 减少锁定范围:尽量使用行级锁而不是表级锁。例如,使用
SELECT ... FOR UPDATE
时,只锁定需要更新的行。 - 避免长时间运行的事务:确保事务尽可能短,尽快提交或回滚事务,减少锁的持有时间。
- 批量处理:对于大量数据的操作,考虑分批处理,以减少单个事务的持续时间和锁的持有时间。
2. 使用合适的隔离级别
- 调整隔离级别:根据应用需求选择合适的隔离级别。例如,使用
READ COMMITTED
而不是SERIALIZABLE
,以减少锁的竞争。 - 避免不必要的锁:在某些情况下,可以使用
NOLOCK
提示来避免读取操作时的锁,但这可能会导致脏读。
3. 优化索引
- 创建适当的索引:确保经常查询的列上有适当的索引,以减少全表扫描和锁的竞争。
- 维护索引:定期重建和重组索引,以保持其效率。
4. 使用分区表
- 分区表:对于大型表,可以使用分区技术来减少锁的竞争。分区表可以将数据分成多个部分,每个部分可以独立地进行操作,从而减少锁的影响。
5. 优化应用程序逻辑
- 减少并发冲突:设计应用程序逻辑时,尽量减少对同一数据的并发访问。例如,通过使用队列或其他机制来序列化对共享资源的访问。
- 使用乐观锁:对于一些非关键性操作,可以使用乐观锁(如版本号控制)来替代悲观锁,减少锁的竞争。
6. 监控和调优
- 监控锁情况:定期监控数据库中的锁情况,使用
V$LOCKED_OBJECT
、V$SESSION
和V$SQLAREA
等视图来识别潜在的锁问题。 - 设置超时:为会话设置合理的锁等待超时时间,防止某个会话长时间占用锁资源。可以通过
ALTER SYSTEM SET LOCK_TIMEOUT = <seconds>
来设置。
7. 使用数据库特性
- 闪回技术:利用 Oracle 的闪回技术(如 Flashback Query)来恢复数据,而不是依赖于复杂的事务回滚。
- 在线重定义:使用在线重定义(Online Redefinition)来修改表结构,而不影响现有事务。
8. 事务管理
- 最小化事务大小:尽量将大事务拆分为多个小事务,以减少锁的持有时间。
- 使用保存点:在长事务中使用保存点(SAVEPOINT),以便在发生错误时可以回滚到特定点,而不是整个事务。
9. 数据库配置
- 调整参数:根据实际情况调整数据库参数,如
UNDO_RETENTION
、DB_FILE_MULTIBLOCK_READ_COUNT
等,以优化数据库性能。 - 使用并行处理:对于大规模数据操作,可以考虑使用并行处理来提高性能和减少锁的竞争。
10. 定期维护
- 定期分析和优化:定期分析数据库性能,找出瓶颈并进行优化。
- 清理无用数据:定期清理不再需要的数据,减少表的大小,从而减少锁的竞争。
总结
通过上述步骤,可以有效地解决 Oracle 数据库中的锁表问题,并找到引起锁表的 SQL 语句。同时,通过实施最佳实践,可以显著减少锁表问题的发生,提高系统的并发性能和稳定性。
相关文章:
Oracle 锁表的解决方法及避免锁表问题的最佳实践
背景介绍 在 Oracle 数据库中,锁表或锁超时相信大家都不陌生,是一个常见的问题,尤其是在执行 DML(数据操作语言)语句时。当一个会话对表或行进行锁定但未提交事务时,其他会话可能会因为等待锁资源而出现超…...
深度学习中的生成对抗网络(GAN)原理与应用
引言 生成对抗网络(Generative Adversarial Network,简称GAN)是由Ian Goodfellow等人在2014年提出的一种深度学习模型,它通过对抗训练的方式生成与真实数据分布相似的假数据。GAN的出现极大地推动了深度学习和生成模型的研究&…...
Swing中JScrollPane面板
一、介绍 在设置界面时,可能会遇到在一个较小的容器窗体中显示一个较大部分的内容的情况,这时可使用JScrollPane面板。JScrollPane面板是带滚动条的面板,是一种容器,但是JScrollPane只能放置一个组件,并且不可使用布局…...
【学习笔记】检测基于RTOS的设计中的堆栈溢出-第2部分
有许多技术可用于检测堆栈溢出。有些使用硬件,而有些则完全在软件中执行。正如我们很快将看到的那样,在硬件中具有这种能力到目前为止是更可取的,因为堆栈溢出可以在发生时立即检测到,事实上,可以避免,因为硬件实际上可以防止对无效访问的写入。 硬件堆栈溢出检测机制通…...
PHP 函数
在php中有非常多的函数,函数这种东西不需要记全,直到怎么使用就行了,如果想了解多点函数,可以查看php官方函数手册,或者参考菜鸟PHP 5 Array 函数 | 菜鸟教程。 创建 PHP 函数 通常函数创建完毕后是用来调用。 语法格…...
centos更换源文件,换源,替换源
期初怎么折腾就是不行,换了源也是不能使用的,最后发现不是换的源不行,而是之前的源文件不行,然后给所有的源文件在yum源统一放在了bak目录下,随后我们再去下载安装源文件。 您将yum源下载之后,先将您的其他…...
【深度学习】四大图像分类网络之VGGNet
2014年,牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司一起研发了新的卷积神经网络,并命名为VGGNet。VGGNet是比AlexNet更深的深度卷积神经网络,该模型获得了2014年ILSVRC竞赛的第二名,…...
线性表-链式描述(C++)
链式实现的线性表: 链式实现的线性表,即链表(Linked List),是一种通过节点(Node)的集合来存储数据的线性数据结构。在链表中,每个节点包含两部分:存储数据的域ÿ…...
C++高阶算法[汇总]
(一)高精度算法概述 高精度算法是指能够处理超出常规数据类型表示范围的数值的算法。在 C 中,标准数据类型通常有固定的位数和精度限制,而高精度算法可以解决大数运算、金融计算和科学计算等领域的问题。 (二&#x…...
机器学习之DeepMind推出的DreamerV3
开放域任务强化学习(Open-Ended Task Reinforcement Learning)的目标是使智能体能够在多样化且未见过的任务中表现出色,同时能够实现任务间的迁移学习。这类研究的重点在于开发通用的学习算法,能够在没有明确任务定义的情况下,从环境中学习并推广到新任务。DeepMind的Drea…...
【Zookeeper】四,Zookeeper节点类型、通知、仲裁、会话
文章目录 Zookeeper的架构znode的版本Zookeeper的节点类型层级树状结构znode的不同类型 Zookeeper监视与通知通知的类型 Zookeeper的仲裁Zk的会话会话的生命周期 Zookeeper的架构 Zookeeper的服务器端运行两种模式:独立模式(standalone)和仲…...
Vue 集成和使用 SQLite 的完整指东
1. 引言 SQLite 是一种轻量级的关系型数据库管理系统,以其简单易用、无需服务器等特点广泛应用于嵌入式系统、移动应用和小型应用程序中。在 Web 开发中,尤其是前端应用开发中,SQLite 可以作为客户端本地存储的一种选择,为用户提…...
CMAKE常用命令详解
NDK List基本用法 Get–获取列表中指定索引的元素 list(Get list_name index output_var)解释 list_name: 要操作集合的名称index: 要取得的元素下标output_var: 保存从集合中取得元素的结果 栗子 list(GET mylist 0 first_element) # 获取第一个元素APPEND–在列表末尾…...
【嵌入式——QT】QT制作安装包
第一步 QT程序写好之后,编译release版本 第二步 拿到release生成的.exe文件 第三步 新建文件夹deploy 第四步 将.exe文件复制到deploy目录下 第五步 在该目录下输入cmd指令,回车 第六步 在打开的命令窗口下输入 windeployqt TegNetCom_1.0.…...
JavaScript 前端开发:从入门到精通的奇幻之旅
目录 一、引言 二、JavaScript 基础 (一)变量与数据类型 (二)运算符 (三)控制结构 三、函数 (一)函数定义与调用 (二)函数作用域 (三&am…...
shell编程基础笔记
目录 echo改字体颜色和字体背景颜色 bash基本功能: 运行方式:推荐使用第二种方法 变量类型 字符串处理: 条件判断:(使用echo $?来判断条件结果,0为true,1为false) 条件语句&a…...
FPGA实现GTP光口视频转USB3.0传输,基于FT601+Aurora 8b/10b编解码架构,提供3套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案本博已有的FPGA驱动USB通信方案 3、工程详细设计方案工程设计原理框图输入Sensor之-->OV5640摄像头输入Sensor之-->芯片解码的…...
使用 PDF API 合并 PDF 文件
内容来源: 如何在 Mac 上合并 PDF 文件 1. 注册与认证 您可以注册一个免费的 ComPDFKit API 帐户,该帐户允许您在 30 天内免费无限制地处理 1,000 多个文档。 ComPDFKit API 使用 JSON Web Tokens 方法进行安全身份验证。从控制面板获取您的公钥和密钥&…...
Jenkins Nginx Vue项目自动化部署
目录 一、环境准备 1.1 Jenkins搭建 1.2 NVM和Nodejs安装 1.3 Nginx安装 二、Jenkins配置 2.1 相关插件安装 2.2 全局工具安装 2.3 环境变量配置 2.4 邮箱配置(构建后发送邮件) 2.5 任务配置 三、Nginx配置 3.1 配置路由转发 四、部署项目 …...
python代码实现问卷星问卷内容获取并写入word文档保存
以下附完整代码。 import os from tkinter import Tk, simpledialog, messagebox from docx import Document import time import requests import re from tkinter import ttk# 使用 tkinter 创建一个简单的输入框来获取用户输入的问卷链接 root Tk() root.title("问卷…...
C# 2024年Visual Studio实用插件集合
在2024年,Visual Studio作为.NET开发者的首选IDE,其插件生态不断壮大,为开发者提供了更高效、便捷的开发体验。本文将介绍一些实用的Visual Studio插件,特别是针对C#开发者,帮助提升开发效率和代码质量。 1. GitHub C…...
基于PHP的香水销售系统的设计与实现
摘 要 时代科技高速发展的背后,也带动了经济的增加,人们对生活质量的要求也不断提高。香水作为一款在人际交往过程中,给对方留下良好地第一印象的产品,在生活中也可以独自享受其为生活带来的点缀。目前香水市场体量庞大ÿ…...
QT去除窗口边框(无边框)
ch21_TencentMeetingLogin::ch21_TencentMeetingLogin(QWidget *parent): QDialog(parent) {ui.setupUi(this);this->setWindowFlags(Qt::FramelessWindowHint);//去除窗口边框 } 但此时窗口不能拖动且点击任务栏程序图标不能最小化! this->setWindowFlags(Q…...
【k8s】监控metrics-server
metrics-server介绍 Metrics Server是一个集群范围的资源使用情况的数据聚合器。作为一个应用部署在集群中。Metric server从每个节点上KubeletAPI收集指标,通过Kubernetes聚合器注册在Master APIServer中。为集群提供Node、Pods资源利用率指标。 就像Linux 系统一样…...
「Qt Widget中文示例指南」如何为窗口实现流程布局?(二)
Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文将展示如何为不…...
EditInPlace就地编辑:Dom vs Form
利用Dom和Form实现就地编辑(EditInPlace)功能,两者在实现方式、用户体验和适用场景上有一些区别。下面我将详细解释这些区别: 1. EditInPlace 就地编辑(EditInPlace)是一种用户界面设计模式,允…...
【SCT63142FIB】15W高集成、高效率的无线功率发射PMIC
SCT63142FIB 15W高集成、高效率的无线功率发射PMIC 描述 SCT63142是一款高度集成的电源管理IC,可实现符合WPC规范的高性能,高效率和成本效益的无线电源发送系统,支持高达15W的功率传输,可与无线应用特定控制器或基于通用MCU的发送…...
STM32F4系列单片机新玩法---Micropython--pyBoard
只需要更改main.py文件的内容即可,例程CRTLV 1、流水灯: # main.py -- put your code here! import pyb while(1): for n in range(1,5) ledpyb.LED(n) led.on() pyb.delay(1000) led.off() 2、灯条,可以改变delay值来凸显效果…...
MFC中如何在工具条动态增加菜单
在C:\temp\VCSamples-master\VC2010Samples\MFC\Visual C 2008 Feature Pack\WordPad 这个例子中倒是有在工具条上动态增加菜单的方法,但有个缺陷,必须预先将需要的按钮定死。现将方法总结如下: 效果如下:点击前: 点击…...
行为型模式-迭代器模式
迭代器模式(Iterator Pattern)是一种行为型设计模式,主要用于提供一种方法顺序访问一个聚合对象中的各个元素,而不需要暴露其内部表示。这个模式常被用于集合类对象(如列表、数组、图等)的实现中。 模式结构…...
SAP SD学习笔记17 - 投诉处理3 - Credit/Debit Memo依赖,Credit/Debit Memo
上一章讲了 请求书(发票)的取消。 SAP SD学习笔记16 - 请求书的取消 - VF11-CSDN博客 再往上几章,讲了下图里面的返品传票: SAP SD学习笔记14 - 投诉处理1 - 返品处理(退货处理)的流程以及系统实操&#…...
digit_eye开发记录(3): C语言读取MNIST数据集
在前两篇,我们解读了 MNIST 数据集的 IDX 文件格式,并分别用 C 和 Python 做了 读取 MNIST 数据集的实现。 基于 C 的代码稍长,基于 Python 的代码则明显更短,然而它们的共同特点是:依赖了外部库: 基于 C …...
快速学习GO语言总结
干货分享,感谢您的阅读!备注:本博客将自己初步学习GO的总结进行分享,希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力,如有错误请留言指正,谢谢! 一、初步了解Go语言 …...
开源多媒体处理工具ffmpeg是什么?如何安装?使用ffmpeg将M3U8格式转换为MP4
目录 一、FFmpeg是什么二、安装FFmpeg(windows)三、将M3U8格式转换为MP4格式 一、FFmpeg是什么 FFmpeg是一款非常强大的开源多媒体处理工具,它几乎可以处理所有类型的视频、音频、字幕以及相关的元数据。 FFmpeg的主要用途包括但不限于&…...
Python面试实战:高效处理海量日志,找出高频IP
Python面试实战:高效处理海量日志,找出高频IP 问题描述 在处理海量服务器日志时,一个常见的需求是统计出现次数最多的IP地址。这不仅有助于分析网站访问流量,还能为安全监控提供有价值的信息。然而,当日志文件过大,无法一次性加载到内存时,如何高效地解决这个问题就成…...
基于Java Springboot蛋糕订购小程序
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信…...
Java进程为什么会消失
深夜,办公室里只剩下电脑屏幕的微光。小王正在紧张地盯着生产环境的监控面板,突然发现一个重要的Java应用进程不见了,就像人间蒸发一般。这种情况在Java开发中并不罕见,让我们一起走进这个技术探案,揭开Java进程神秘消…...
继上一篇,设置弹框次数以及自适应图片弹框,部分机型(vivo)老手机不显示的问题
上一篇写的本来测试好多型号都无事, 今天下午公司的战斗机vivo横空冒出… 晕 弹框直接显示都出不来了,现在还有用这种老的机型的,但是没办法咯~ 前端遇到这种兼容性的问题就要勇于解决 主要解决了这几点: // 添加图片加载事件 <imgv-if"imageUrl":src"image…...
【docker】容器卷综合讲解,以及go实现的企业案例
容器卷(Volumes)基础讲解: 容器概念 容器卷(Volumes)是 Docker 提供的一种持久化存储机制,允许容器持久化数据,即使容器被删除或重新创建,数据仍然可以保留。 卷是独立于容器的&…...
八、利用CSS制作导航栏菜单
8.1 水平顶部导航栏 水平菜单导航栏是网站设计中应用范围最广的导航设计,一般放置在页面的顶部。水平导航适用性强,几乎所有类型的网站都可以使用。 如果导航过于普通,无法容纳复杂的信息结构,就需要在内容模块较多的情况…...
windows下安装node.js和pnpm
首先,一定要powershell右键选择管理员身份运行,否则第三个命令报错。 # 安装 fnm (快速 Node 管理器) winget install Schniz.fnm# 配置 fnm 环境 fnm env --use-on-cd | Out-String | Invoke-Expression# 下载并安装 Node.js fnm use --install-if-mis…...
MyBlog(五) -- 用户注册页面完善
文章目录 前言一、用户数据提交1. 表单2. 校验数据3. 模版文件1. wait_start2. user_register 二、验证1. 发送邮件1. 注册163邮箱后登录并设置2. 开启IMAP/SMTP服务, IMAP/SMTP服务3. 新增授权密码 2.邮箱内容3.点击注册4.发送邮件5. 激活账号1. 完善激活功能 -- user_active2…...
NLP任务四大范式的进阶历程:从传统TF-IDF到Prompt-Tuning(提示词微调)
引言:从TF-IDF到Prompt-Tuning(提示词微调),NLP的四次变革 自然语言处理(NLP)技术从最早的手工特征设计到如今的Prompt-Tuning,经历了四个重要阶段。随着技术的不断发展,我们的目标…...
量化交易系统开发-实时行情自动化交易-8.3.开拓者TBQuant平台
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来会对于开拓者TBQuant平台介绍。 …...
第八课 Unity编辑器创建的资源优化_特效篇(Particle System)详解
无论是CPU还是GPU,粒子系统对其的影响面都是不容小觑的。随着项目的重度化和3A化,玩家的口味变挑剔了、游戏玩法复杂度变高了、画面的特效表现变复杂了......所以我们还是更加谨慎地对待粒子系统。 特效(Particle System) 游戏效…...
redis常见数据类型
Redis是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理,支持多种数据类型。 一、数据类型介绍 String(字符串) Redis中最基本的数据类型。可以存储任何类型的数据,包括字符串、数字和二进制…...
【解决安全扫描漏洞】---- 检测到目标站点存在 JavaScript 框架库漏洞
1. 漏洞结果 JavaScript 框架或库是一组能轻松生成跨浏览器兼容的 JavaScript 代码的工具和函数。如果网站使用了存在漏洞的 JavaScript 框架或库,攻击者就可以利用此漏洞来劫持用户浏览器,进行挂马、XSS、Cookie劫持等攻击。 1.1 漏洞扫描截图 1.2 具体…...
深入解析 Kubernetes 节点操作:Cordon、Uncordon 和 Drain 的使用与最佳实践
摘要 Kubernetes 是一个用于自动化容器部署、扩展和管理的开源系统,而节点管理是其核心功能之一。cordon、uncordon 和 drain 是 Kubernetes 提供的与节点操作相关的三个重要命令,用于节点的调度控制和维护管理。本文将从概念、命令解析、内部机制和最佳…...
python array矩阵相关操作
目录: 一、判断某个值是否在array二维数组的某列中 二、根据某列中的特定值筛选array数组 三、查找一个元素在二维 array 矩阵中的位置 四、判断array数组中的每个元素是否包含特定的子字符串 一、判断某个值是否在array二维数组的某列中 在 Python 中…...
网络安全——浅谈HTTP协议
HTTP请求 HTTP请求是客户端往服务端发送请求动作,告知服务器自己的要求。 HTTP请求由状态行、请求头、请求正文三部分组成: 状态行:包括请求方式Method、资源路径URL、协议版本Version;请求头:包括一些访问的域名、…...