在 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)
慕桂英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)
}
...
- 2 回答
- 0 关注
- 135 浏览
添加回答
举报
0/150
提交
取消