【问题标题】:Cloud Spanner session handling in Cloud FunctionsCloud Functions 中的 Cloud Spanner 会话处理
【发布时间】:2020-01-05 13:59:23
【问题描述】:

我正在使用 Cloud Functions 和 nodeJS 客户端库将数据插入 Spanner。该函数被Pub/sub约2次/秒调用,使用事务插入数据。

阅读文档时,它清楚地表明您必须通过调用来关闭会话: database.close(); 当我这样做时,它会抛出一个错误:

Error: Database is closed. at SessionPool.<anonymous>   
(/srv/node_modules/@google-cloud/spanner/build/src/session-   
pool.js:264:23)
at Generator.next (<anonymous>) at /srv/node_modules/@google-
cloud/spanner/build/src/session-pool.js:22:71 at new Promise
(<anonymous>) at __awaiter (/srv/node_modules/@google-
cloud/spanner/build/src/session-pool.js:18:12) at SessionPool._acquire 
(/srv/node_modules/@google-cloud/spanner/build/src/session-
pool.js:262:16) at SessionPool.getReadSession 
(/srv/node_modules/@google-cloud/spanner/build/src/session-
pool.js:204:14) at Database.runStream (/srv/node_modules/@google-
cloud/spanner/build/src/database.js:1157:20) at Database.run 
(/srv/node_modules/@google-cloud/spanner/build/src/database.js:988:14) 
at PromiseCtor (/srv/node_modules/@google-
cloud/promisify/build/src/index.js:71:28)

所以我的问题是:Spanner 会话在 Cloud 函数中的处理方式是否不同?它是否缓存会话以供下次调用? 我做错了什么,我不应该在云函数中调用 database.close() 吗?

我在返回transaction.commit()和调用transaction.end()之后调用database.close();

谢谢!

【问题讨论】:

  • 你说的是this docs 对吧?你也看过tutorial of Cloud functions and Cloud Spanner吗?
  • 是的,这些是我读过的文档。在后一个链接中,不调用 database.close() 。那么我应该假设数据库连接在云功能中得到处理和兑现吗?还是为每个 Cloud 函数调用创建一个新会话?

标签: google-cloud-platform google-cloud-functions google-cloud-spanner


【解决方案1】:

正如您在 cmets 上提到的,每次都会创建一个新会话,这在 the docs 上有所提及。

您提到的tutorial 也没有在我这边正确运行,所以我查看了Cloud Functions and Cloud SQL 上的文档,这里指出:

我们建议您不要在函数结束时关闭连接 称呼。如果您不在全局范围内使用池,和/或如果您创建 功能范围内的单个连接,那么您应该关闭这些 函数返回之前的连接。

所以这应该适用于任何连接,包括扳手

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 2017-07-07
    • 2021-01-25
    • 2018-09-10
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多