ORM
支持传递自定义的context
上下文变量,用于异步IO
控制、上下文信息传递(特别是链路跟踪信息的传递)、以及嵌套事务支持。
我们可以通过Ctx
方法传递自定义的上下文变量给ORM
对象,Ctx
方法其实是一个链式操作方法,该上下文传递进去后仅对当前DB
接口对象有效,方法定义如下:
func Ctx(ctx context.Context) DB
我们来看一个通过上下文变量控制请求超时时间的示例。
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
_, err := db.Ctx(ctx).Query("SELECT SLEEP(10)")
fmt.Println(err)
该示例中执行会sleep 10秒中,因此必定会引发请求的超时。执行后,输出结果为:
context deadline exceeded, SELECT SLEEP(10)
上下文变量也可以传递链路跟踪信息,并且可以和日志组件结合,将链路信息打印到日志中(仅当ORM
日志开启时)。
模型对象也支持上下文变量的传递,同样也是通过Ctx
方法。我们来看一个简单的示例,我们将示例2的例子通过模型操作调整一下。
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
)
func main() {
_, err := g.DB().Model("user").Ctx(gctx.New()).All()
if err != nil {
panic(err)
}
}
执行后,终端输出为:
2020-12-28 23:46:56.349 [DEBU] {38d45cbf2743db16f1062074f7473e5c} [ 5 ms] [default] [rows:0 ] SHOW FULL COLUMNS FROM `user`
2020-12-28 23:46:56.354 [DEBU] {38d45cbf2743db16f1062074f7473e5c} [ 5 ms] [default] [rows:100] SELECT * FROM `user`
其中SHOW FULL COLUMNS FROM `user`
为ORM
组件的数据表字段获取查询,每个表在执行操作之前仅会查询一次并缓存结果到内存中。
嵌套事务的支持依赖Context
上下文变量的层级传递。
资源管理设计的目标之一是在开发阶段不影响静态文件的开发管理,只有在发布的时候执行打包即可,打包完毕后清理临时文件,因此只...
基本介绍支持并发安全开关选项的map容器,最常用的数据结构。该模块包含多个数据结构的map容器:HashMap、TreeMap和List...
基本介绍动态大小的并发安全队列。同时,gqueue也支持固定队列大小,固定队列大小时队列效率和标准库的channel无异。使...
约瑟夫问题我们使用ring来模拟一下约瑟夫问题:著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太...
gcron与gtimer区别定时任务-gcron与定时器-gtimer区别:gtimer属于高性能模块,是框架核心模块,构建任何定时任务的基础,任...