Google Cloud Datatore Go Client 默认不关闭连接?
Google Cloud Datatore Go Client doesn't close the connection by default?
我在 从 App Engine Go 1.9 迁移 到 1.11[=42 时遇到了很多问题=].
当我按照指南如何迁移时,我注意到内存使用量疯狂增长。之前它一直保持在 ~50-60 MB,但现在它迅速增长到 1.5 GB,并且实例开始失败。
但后来我注意到所有展示如何使用 GCP 数据存储的示例都替换了之前的
datastore.Get()
和
dsClient := datastore.NewClient(...) dsClient.get()
然后,当我仔细观察这个客户端时,它创建了一个连接但似乎从未关闭它,所以当我在创建一个新客户端后添加一个 defer dsClient.Close()
(基本上每个调用处理程序),内存开始从大约 ~60-80 MB 上升到 ~500 MB 然后下降;它一直这样,但它很稳定,所以我认为它时不时地进行一次 GC。然而,几天后它再次失败并且请求永远持续并且创建新实例直到达到上限(之前失败更快).
所以我想知道我是否应该只在 main 中创建一个 Datastore Client?这是一个好习惯吗?而且,如果是这样,为什么所有示例都显示它是在调用句柄中创建的,为什么从来没有关闭连接的调用?
谢谢!
我几乎做了同样的事情,但 godoc 说要创建一个客户端并将其重新用于所有数据存储操作。无需关闭连接。
// Create a datastore client. In a typical application, you would create
// a single client which is reused for every datastore operation.
dsClient, err := datastore.NewClient(ctx, "my-project")
if err != nil {
// Handle error.
}
我在 从 App Engine Go 1.9 迁移 到 1.11[=42 时遇到了很多问题=].
当我按照指南如何迁移时,我注意到内存使用量疯狂增长。之前它一直保持在 ~50-60 MB,但现在它迅速增长到 1.5 GB,并且实例开始失败。
但后来我注意到所有展示如何使用 GCP 数据存储的示例都替换了之前的
datastore.Get()
和
dsClient := datastore.NewClient(...) dsClient.get()
然后,当我仔细观察这个客户端时,它创建了一个连接但似乎从未关闭它,所以当我在创建一个新客户端后添加一个 defer dsClient.Close()
(基本上每个调用处理程序),内存开始从大约 ~60-80 MB 上升到 ~500 MB 然后下降;它一直这样,但它很稳定,所以我认为它时不时地进行一次 GC。然而,几天后它再次失败并且请求永远持续并且创建新实例直到达到上限(之前失败更快).
所以我想知道我是否应该只在 main 中创建一个 Datastore Client?这是一个好习惯吗?而且,如果是这样,为什么所有示例都显示它是在调用句柄中创建的,为什么从来没有关闭连接的调用?
谢谢!
我几乎做了同样的事情,但 godoc 说要创建一个客户端并将其重新用于所有数据存储操作。无需关闭连接。
// Create a datastore client. In a typical application, you would create
// a single client which is reused for every datastore operation.
dsClient, err := datastore.NewClient(ctx, "my-project")
if err != nil {
// Handle error.
}