Google Cloud Datatore Go Client默认不关闭连接吗?

时间:2019-10-02 07:13:30

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

转到1.9 1.11 ,从App Engine 迁移遇到了很多问题。

当我按照指南进行迁移时,发现内存使用量不断增加。之前它一直稳定在〜 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吗?这是一个好习惯吗?而且,如果是这样,为什么所有示例都显示它是在调用句柄中创建的,为什么从来没有调用来关闭连接?

谢谢!

1 个答案:

答案 0 :(得分:2)

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