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

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

问题的提出

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

//有WithContext
dao.WinUser.WithContext(l.ctx).Where(...)

//没有WithContext
dao.WinUser.Where(...)

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

区别

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

有WithContext

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

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

比如:

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会直接执行操作,而不会受到外部上下文的控制。这意味着这些数据库操作在正常情况下会执行完毕,但你无法控制操作的超时、取消等行为。

result := db.Find(&users)

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

什么时候应该用WithContext?

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

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

什么时候不应该用WithContext?

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

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

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


http://www.kler.cn/news/356381.html

相关文章:

  • 【设计模式】深入理解 Python 单例模式:从原理到实现
  • 第8篇:网络安全基础
  • Docker 安装sql server 登陆失败
  • .NET Sqlite加密
  • Golang | Leetcode Golang题解之第475题供暖器
  • 飞控开发软件有哪些?技术详解
  • HCIP--1实验DNS,VLAN,静态路由,浮动静态,动态路由协议,Telnet
  • Scala大数据开发
  • Java—类和对象习题讲解
  • UNI VFX Missiles Explosions for Visual Effect Graph
  • SpringBoot Data JPA基本使用
  • 《CS:GO》的标志性实验地图在 RTX GPU 神经网络中运行
  • Linux_进程概念详解(续)_命令行参数_环境变量_进程地址空间
  • SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
  • MYSQL基础快速入门
  • 单片机探秘:从理论到应用
  • MYSQL-查看数据库中的存储过程语法(六)
  • 【Cadence27】HDL拷贝工程➕Allegro导出DXF和3D文件STP
  • Windows 与 Java 环境下的 Redis 利用分析
  • 生活中的感悟