什么时候在golang Web服务器上准备postgresql语句?

ako*_*nsu 4 postgresql go

我有一个连接到postgresql数据库的Web服务器.据我所知,postgresql驱动程序在内部管理连接池,因此我将数据库连接作为全局变量.

我正在使用预处理语句,我不知道main在服务器启动之前在我的函数中提前准备它们是否是一个好主意,或者在我的请求处理程序中执行它(如下所示).我是golang的新手.我认为使语句全局化更有效,但我不确定.请帮忙.

var db *sql.DB

func main() {
  router = pat.New()
  router.Get("/", handler)
  db, e := sql.Open("postgres", "...")
  ...
  http.ListenAndServe("127.0.0.1", router)
}

func handler(w http.ResponseWriter, r *http.Request) {
  s, e := db.Prepare("select * from mytable where field=$1")
  r, e := s.Exec(123)
  ...
}
Run Code Online (Sandbox Code Playgroud)

Elw*_*nar 9

这一切都取决于您的用例.根据经验,我会说你应该在运行服务器之前准备好你的语句,原因有很多:

  • 如果语句没有正确准备,您可能无法启动.如果您即时准备它们,失败的语句可能会在启动后很长时间内使整个程序无效.
  • 如果事先准备它们,则不必处理并发:如果需要时进行准备,则必须使用同步机制来确保不会多次并行准备语句,这将以SQL服务器中断为止火焰...
  • 处理起来更简单.

至于你的数据库句柄,你应该使语句全局化,以便随时使用它们而不必传递指针.如果您发现自己处理许多语句,例如超过10-15(任意数字),您可能会发现将所有与数据库相关的内容(数据库初始化,查询等)放入主包的子包中会更容易.