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

Posted

技术标签:

【中文标题】在 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

【讨论】:

以上是关于在 go http 的自定义处理程序中传递 *gorm.db 实例的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

golang Go Web Applications中的自定义处理程序和避免全局 - http://elithrar.github.io/article/custom-handlers-avoidi

Go Web 编程之 请求

使用安装了 Firebase 的自定义崩溃处理程序

go语言:函数参数传递详解

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

go语言:函数参数传递详解