在 go http 的自定义处理程序中传递 *gorm.db 实例的最佳实践

     2023-02-25     104

关键词:

【中文标题】在 go http 的自定义处理程序中传递 *gorm.db 实例的最佳实践【英文标题】:Best Practice to pass *gorm.db instance in a custom handler in go http 【发布时间】:2018-11-26 17:24:15 【问题描述】:

我正在创建一个自定义 Web 处理程序来处理我在 Web 应用程序中的路由。

处理程序是

type CustomHandler struct
Db *gorm.DB

然后是接收函数:

func (h CustomHandler) Index() http.Handler 
   return http.handlerFunc(w http.ResponseWriter,r *http.Request)
   //Some code
   //use h.Db.Find() ,etc.
)

我将其传递给我的路由器

//In package 
customHandler := &CustomHandler*gormInstance //I've already got the instance
router.Handle("/someroute", customHandler.index() )

但是这个问题是 gorm.DB 实例,作为一个指针,一旦它在一个请求期间通过路由,它就会发生变异。 我是否必须生成初始 gorm 实例的不同副本?如果是这样,我如何通过每个请求的每个路由传递它们?

【问题讨论】:

【参考方案1】:

根据 Gorm 文档:

所有链方法都会克隆并创建一个新的数据库对象(共享一个 连接池),GORM 可以安全地被多个并发使用 协程。

Gorm 在需要时自动创建克隆,无需手动处理。有关更多信息,请查看文档中的此页面:http://gorm.io/docs/method_chaining.html

【讨论】:

12.go语言文件处理(代码片段)

...别是如何读写标准格式(如XML和JSON格式)的文件以及自定义的纯文本和二进制格式文件。由于前面的内容已覆盖Go语言的所有特性,现在我们可以灵活地使用Go语言提供的所有工具。我们会充分利用这种灵活性并利用闭包来避免... 查看详情

go语言中使用deferpanicrecover处理异常

...出错之前进行拦截,在错误出现后进行错误捕获,如果在定义的方法中defer定义的方法如果在panic后面,defer定义的方法就无法执行到。如下代码:packagemainimport"fmt"functest(iint) vararr[10]int //错误拦 查看详情

在 Go HTTP 处理程序中使用未导出的结构键获取上下文值时为 nil

】在GoHTTP处理程序中使用未导出的结构键获取上下文值时为nil【英文标题】:ContextvalueisnilwhengettingitwithunexportedstructkeyinGoHTTPhandlers【发布时间】:2021-07-0620:48:10【问题描述】:感谢您提供任何帮助!我确定我错过了一些非常基本... 查看详情

go语言之并发

...为一个独立的工作单元。这个单元会被调度到可用的逻辑处理器上执行。Go语言运行时的调度器是一个复杂的软件,这个调度器在操作系统之上。操作系统的线程与语言运行时的逻辑处理器绑定,并在逻辑处理器上运行goroutine。Go语... 查看详情

在运行 Go 程序时重新加载配置表

...】:2021-06-1312:52:00【问题描述】:我有一个具有多个HTTP处理程序包装器的Web服务器。其中之一是ACL,它作为结构数组从CSV加载并传递给ACLHTTP处理程序。我希望能够更改csv文件以更新新的过滤器条目,而无需重新启动Web服务器。... 查看详情

java示例代码_获取从标记处理程序中的自定义标记传递的值

java示例代码_获取从标记处理程序中的自定义标记传递的值 查看详情

go语言之http(代码片段)

...用于在指定的TCP网络地址addr进行监听,然后调用服务端处理程序来处理传入的连接请求。该方法有两个参数:第一个参数addr即监听地址;第二个参数表示服务端处理程序,通常为空,这意味着服务端调用http.DefaultServeMux进行处... 查看详情

Go中基于HTTP的JSONRPC [重复]

...解码器使用网络连接作为输入,因此您不能将其与goRPCHTTP处理程序一起使用。我附上了使用TC 查看详情

go中每个处理程序方法的并发连接数(代码片段)

funchandleForServer1(reshttp.ResponseWriter,req*http.Request)rPayload:=parseRequestBody(req)serve("http://server1:8080",res,req)funchandleForServer2(reshttp.ResponseWriter,req*http.Request)rPayload 查看详情

如何在 Go Rpc 中使用自定义错误

...在使用go标准库中的rpc包,我希望能够通过RPC调用返回我的自定义错误。我有下面的自定义错误类:const(UNAVAILABLE="unavailable"GETERROR="get-error"OTHER="generic-error")typeCustomErr 查看详情

深入剖析:一套在go中传递、返回、暴露错误,便于回查的解决方案

...C这种“中级语言”虽然没有,但是程序员也可以使用宏定义的方式,来实现某种程度上的错误断言。但是,对于Go的情况就比较尴尬了。我们先来看断言,我们的目的是,仅使用一行代码就能够检查错误并终止当前函数。由于没... 查看详情

go语言之go语言异常处理与测试(代码片段)

...r注意:1、利用recover处理panic指令,defer必须放在panic之前定义,另外recover只有在defer调用的函数中才有效。否则当panic时,recover无法捕获到panic,无法防止panic扩散。2、recover处理异常后,逻辑并不会恢复到panic那个点去,函数跑... 查看详情

go语言中将函数作为变量传递

在Go中函数也是一种变量,我们可以通过type来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型,函数当做值和类型在我们写一些通用接口的时候非常有用,通过下面这个例子我们可以看到testInt类型是一个... 查看详情

go中的http.listenandserve

...,第二个参数叫做处理器,handle函数将处理器加入到内部定义的map,此map的key值为模式(如上面"/test"、"/demo")的串,值为muxEntry类型。如果模式的处理程序已经存在,则会抛出异常,muxEntry分别保存这handle传入的... 查看详情

在一个 go 程序中同时运行两个 Web 服务器

...于对http.handle的调用,当我尝试为第二台服务器注册“/”处理程序时,它会出现恐慌并说已经有一个与“ 查看详情

有没有办法在 ASP.NET Core 2.1 中捕获对 Razor 页面不存在的自定义处理程序的 HTTP 请求?

】有没有办法在ASP.NETCore2.1中捕获对Razor页面不存在的自定义处理程序的HTTP请求?【英文标题】:IsthereawaytocatchaHTTPrequesttoanonexistingcustomhandlerforRazorPagesinASP.NETCore2.1?【发布时间】:2019-07-0111:06:05【问题描述】:我是RazorPages的新手... 查看详情

go+http服务器教程(5.2)(代码片段)

...好支持。在本文中,我们将重点看如何利用Go+语言定义HTTP请求接口和启动服务端口。接下来我们就来了解一下这部分的一些内容。导入包Go+在接收网络请求时,一般使用的工具库是net/http包,导入方式如下:... 查看详情

go+http服务器教程(5.2)(代码片段)

...好支持。在本文中,我们将重点看如何利用Go+语言定义HTTP请求接口和启动服务端口。接下来我们就来了解一下这部分的一些内容。导入包Go+在接收网络请求时,一般使用的工具库是net/http包,导入方式如下:... 查看详情