如何在 Golang Cloud 函数中重用数据库连接?

How can one reuse a database connection in Golang Cloud functions?

我目前正在尝试将我的应用程序迁移到 IBM 云功能,但我面临的一个问题是防止每次调用操作时重新连接 Postgresql 数据库。

我发现关于如何在 Go 中重用数据库连接的信息很少,而且我尝试过的解决方案(将数据库处理程序保存在全局变量中)也不起作用。

谁能告诉我正确的文档?

谢谢,

-托马斯

PS:这是一段代码,说明了我尝试的方式:

func Storage() Storager {
    once.Do(func() {
        db := InitDB()
        println("Initiating DB...")
        s = &storage{
            db: db,
        }
    })

    return s
}

// This is declared as a global variable in main
var s = storage.Storage()

可以在 OpenWhisk 操作中保留全局状态,这适用于 Golang 函数。例如,这里有一个 counter.go 函数,它会在每次调用该函数时递增一个全局计数器。

package main

var counter = 1

func Main(args map[string]interface{}) map[string]interface{} {
  msg := make(map[string]interface{})
  msg["counter"] = counter
  counter = counter + 1
  return msg
}

如果您创建此操作并且 运行 它连续多次,您将看到计数器值每次都增加。

> wsk action create counter counter.go
> wsk action invoke counter --result
{
  "counter": 1
}
> wsk action invoke counter --result
{
  "counter": 2
}
> wsk action invoke counter --result
{
  "counter": 3
}

那么您正在尝试做的事情应该会奏效。在您的示例中,检查操作是否成功完成并且没有引发错误和失败(这会阻止进一步重用)。此外,检查激活记录以查看激活是热激活还是冷激活。这可以通过检查激活记录是否有 initTime 注释来指示冷启动来看出。如果不存在,则激活是温暖的,并且最新的激活 运行 与之前的激活处于相同的上下文中。