我正在使用带有 nodeJS 客户端库的 Cloud Functions 将数据插入到 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 会话的处理方式是否不同?它是否缓存会话以供下次调用?我做错了什么,我不应该在云函数中调用 database.close() 吗?
我在返回 transaction.commit() 和调用 transaction.end() 之后调用 database.close();
谢谢!
正如您在评论中提到的,每次都会创建一个新会话,这在 docs 中提到。
此外,您提到的教程没有 database.close() 在我这边正确运行,所以我查看了Cloud Functions 和 Cloud SQL上的文档,这里说明:
我们建议您不要在函数调用结束时关闭连接。如果您不在全局范围内使用池,和/或如果您在函数范围内创建单独的连接,那么您应该在函数返回之前关闭这些连接。
所以这应该适用于任何连接,包括扳手
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句