在 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