为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 访问共享连接资源的最佳实践?

Golang 访问共享连接资源的最佳实践?

Go
肥皂起泡泡 2021-11-01 16:56:28
在 golang(RabbitMQ、数据库等)中处理与外部服务的共享连接资源的处理范围的最佳实践是什么?例如,给定这段代码使用 database/sql、pq 和 http:func main() {    db, err := sql.Open("postgres", "user=root dbname=root")        if err != nil {        log.Fatal(err)    }    http.HandleFunc("/", front_handler)    http.HandleFunc("/get", get_handler)    http.HandleFunc("/set", set_handler)    http.ListenAndServe(":8080", nil)}使db对象可供我注册的处理程序使用的最佳方法是什么?我是否将db声明放在主要范围之外(这会导致我在 Python 中出现单元测试问题,但在这里可能没问题)?我是否将处理程序声明放在主范围内(似乎不允许我嵌套函数)?是否有我可以用来访问主范围的寻址方案(我会在 puppet 中做类似的事情)?还有其他选择吗?
查看完整描述

2 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

有很多方法可以解决这个问题。首先,在此范围内打开连接后,您可能希望将其推迟到此处关闭。


db, err := sql.Open("postgres", "user=root dbname=root")

        if err != nil {

        log.Fatal(err)

    }

defer db.Close()

这将确保在您离开此范围时清除连接。关于您的处理程序......将它们编写为与连接相同范围内的闭包很简单,因此您可以自由使用它。


编辑:澄清一下,你说你认为你不能在 main.js 中嵌套函数。你可以用类似的东西来做到这一点;


get_handler := func() {

      return db.ReadTheData()

}

http.HandleFunc("get", get_handler)


查看完整回答
反对 回复 2021-11-01
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

大多数应用程序从全局范围内的数据库处理程序开始是很常见的。sql.DB被定义为对并发访问是安全的,因此可以被所有需要它的处理程序同时使用。


var db *sql.DB


func main() {

    var err error

    db, err = sql.Open("postgres", "user=root dbname=root")

    if err != nil {

        log.Fatal(err)

    }

...


查看完整回答
反对 回复 2021-11-01
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信