我应该在哪里存储全局数据库实例?
问题描述:
我应该在初始化数据库实例后将其存储在哪里?我想从请求处理程序访问它们。我应该在哪里存储全局数据库实例?
// server.go
storage, err := config.GetFileStorage(viper.GetViper())
if err != nil {
log.Fatal(fmt.Sprintf("Failed to configure the file storage: %v\n", err))
}
db, err := config.GetDatabase(viper.GetViper())
if err != nil {
log.Fatal(fmt.Sprintf("Failed to configure the database: %v\n", err))
}
这只是主函数中的局部变量。我怎么能把它们暴露给处理程序的包?
答
您可以将数据库连接包装在一个结构中,并让它返回您的http处理程序。事情是这样的:
package main
import (
"database/sql"
"log"
"net/http"
)
type DBManager struct {
db *sql.DB
}
func (m *DBManager) HelloHandler() http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
rows, err := m.db.Query("SELECT hello FROM world")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer rows.Close()
for rows.Next() {
// do stuff
}
})
}
func main() {
db, err := sql.Open("", "")
if err != nil {
panic(err)
}
m := DBManager{db: db}
http.Handle("/", m.HelloHandler())
log.Fatal(http.ListenAndServe(":8080", nil))
}
另外,还要确保你的对象可以处理像* sql.DB https://golang.org/pkg/database/sql/#DB
并发访问如果你想/需要分享更多的跨处理器,你可以看看环境模式:http://www.jerf.org/iri/post/2929