【问题标题】:Google Cloud Datatore Go Client doesn't close the connection by default?Google Cloud Datatore Go Client 默认不关闭连接?
【发布时间】:2019-10-02 07:13:30
【问题描述】:

我在从 Go 1.9 上的 App Engine迁移1.11 时遇到了很多问题。

当我按照指南进行迁移时,我注意到内存使用量急剧增长。之前它一直保持在 ~50-60 MB,但现在它迅速增长到 1.5 GB,并且实例开始出现故障。

但后来我注意到所有展示如何使用 GCP 数据存储的示例都替换了之前的

datastore.Get()

dsClient := datastore.NewClient(...) dsClient.get()

然后,当我仔细观察这个客户端时,它创建了一个连接,但似乎从未关闭它,所以当我在创建新客户端后添加defer dsClient.Close()(基本上在每个调用处理程序中) em>,内存开始从 ~60-80 MB 上升到 ~500 MB,然后下降;它一直这样运行,但它很稳定,所以我认为它时不时会进行 GC。然而,几天后它又失败了,请求永远持续下去,并创建了新实例,直到达到上限(以前失败得更快)

所以我想知道我是否应该只在 main 中创建一个数据存储客户端?这是一个好习惯吗?如果是这样,为什么所有示例都显示它是在调用句柄中创建的,为什么从来没有调用关闭连接?

谢谢!

【问题讨论】:

    标签: google-app-engine go google-cloud-datastore


    【解决方案1】:

    我几乎做了同样的事情,但 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.
        }
    

    https://godoc.org/cloud.google.com/go/datastore

    【讨论】:

    • 好了,谢谢,我完全错过了! go 1.9 到 1.11 没有提到它(显然至少)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2018-03-21
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多