Gorm操作数据库,有和没有WithContext的区别

devtools/2024/10/21 16:57:59/

问题的提出

本人是Go服务器的新中新中新手,在使用数据库操作时,看到代码中有些查询语句会先调用WithContext再查询,如:

Go">//有WithContext
dao.WinUser.WithContext(l.ctx).Where(...)//没有WithContext
dao.WinUser.Where(...)

对于以上的区别以及如何选择都不怎么理解,故在此做一个总结。

区别

了解WithContext和不使用WithContext的区别,主要能够帮助我们更好地处理数据库操作的生命周期和响应时间。

WithContext

用于将Gocontext.Context对象与数据库操作绑定在一起,主要作用是对控制请求的超时、取消、追踪等。

WithContext方法可以传递一个context.Context对象,这个对象提供了对操作生命周期的控制,包括超时、取消等功能。使用WithContext时,操作可以被取消或在超时后自动中断,避免长时间阻塞或耗时操作影响整个系统的性能。

比如:

Go">ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()result := db.WithContext(ctx).Find(&users)

WitchContext还有一些优点:

1.超时控制:你可以设置超时时间,如果操作在指定的时间内没有完成,将会自动取消。例如上面代码中,操作在 2 秒后会自动超时并取消。

2.取消操作:通过传递Context,你可以在需要时手动取消数据库操作。比如,如果用户请求已经取消,你可以随时停止相关的数据库操作,避免浪费资源。

3.追踪和监控:context.Context还可以携带一些请求的元数据(如日志追踪 ID),方便进行分布式追踪或监控。

没有WithContext

如果你在执行数据库操作时没有使用WithContextGORM会直接执行操作,而不会受到外部上下文的控制。这意味着这些数据库操作在正常情况下会执行完毕,但你无法控制操作的超时、取消等行为。

Go">result := db.Find(&users)

在这种情况下,GORM将按照默认方式执行Find操作,等待数据库响应,直到完成为止。如果这个数据库查询因为某些原因(如网络延迟、数据库阻塞)变得特别耗时,你无法通过外部干预来中止这个操作。

什么时候应该用WithContext

Web服务或API:当你开发Web服务时,HTTP请求的生命周期是有限的,用户可能会取消请求或者请求超时。在这种场景下,使用WithContext能有效防止长时间执行的数据库操作浪费资源。

批处理任务:批处理任务可能需要定期执行特定数据库操作,如果操作耗时过长,使WithContext可以防止资源占用,确保任务按时完成或被取消。

什么时候不应该用WithContext

后台异步任务:无需外部控制的后台任务,使用 WithContext 可能会引入不必要的中断。

操作快速完成且时间可预期:简单、快速的数据库操作不需要上下文控制。

没有取消需求的任务:任务本身不需要被外部取消,可以直接执行。


http://www.ppmy.cn/devtools/127616.html

相关文章

第六章 元素应用CSS

6.1 使用CSS设置字体样式 6.1.1.字体类型 CSS 提供 font-family属性来控制文本的字体类型。 格式如下: font-family:字体名称; 参数:字体名称按优先顺序排列,以逗号隔开。如果字体名称包含空格,则应用引号括起。 说明&#xff…

电机学习-Park变换

一、Park变换 坐标关系: I d I α ∗ c o s θ e I β ∗ s i n θ e I_d I_\alpha*cos\theta_e I_\beta*sin\theta_e Id​Iα​∗cosθe​Iβ​∗sinθe​ I q − I α ∗ s i n θ e I β ∗ c o s θ e I_q -I_\alpha*sin\theta_e I_\beta*cos\theta_…

si551x时钟芯片linux下调试笔记

目录 前言一、依赖文档、工具二、让芯片工作的流程三、以上步骤的SOC下代码实现 前言 本文总结调试SKYWORKS芯片厂商Si5512时钟芯片时的笔记,基于linux5.10.xxx内核,在arm64架构的SOC上验证; 一、依赖文档、工具 文档名说明下载链接Si5518…

基于stm32的楼宇照明控制系统设计

基于stm32的楼宇照明控制系统设计 项目说明一、绪论1.1 研究背景1.2 研究意义1.4 研究内容 二、系统方案设计2.1 微控制器方案选择2.2 信息检测模块方案选择2.3 WiFi模块选择2.4 终端显示2.5 WiFi无线通信实现方法 三、系统硬件电路图设计3.1 整体电路图设计3.2 主控制器设计3.…

电脑格式化了还能恢复数据吗?

许多人在使用电脑时可能会误操作或出于需要对电脑硬盘进行格式化,格式化会迅速清空数据。问题是格式化后的数据还能恢复吗?答案是:在某些情况下,格式化后的数据是可以恢复的。不过,恢复的成功率取决于格式化的类型和后…

【进阶OpenCV】 (17)-- Dlib库 --实现人脸检测

文章目录 Dlib库一、Dlib库安装二、实现人脸检测1. 生成人脸检测器2. 检测人脸3. 显示人脸 总结 Dlib库 Dlib提供了丰富的图像处理和计算机视觉工具,如面部特征检测、物体检测、图像变换等,这些工具使得开发者能够轻松地进行各种图像处理任务。 一、Dl…

java版Spring Cloud+Mybatis+Oauth2+分布式+微服务+实现工程管理系统

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管…

[C编程入门] 第七章:C语言中的文件操作

💖💖⚡️⚡️专栏:C编程入门-轻松入门/系统总结⚡️⚡️💖💖 [C编程入门] 专为C语言初学者设计,提供轻松易懂的入门教程与系统的知识总结。本专栏将带你从零开始,循序渐进地掌握C语言的核心概念…