我有一个无服务器函数通过python-cloudant库调用Cloudant数据库,客户端的连接是在函数处理程序之外进行的,因此它被缓存,如下所示:
httpAdapter = HTTPAdapter(pool_connections=5, pool_maxsize=100)
client = Cloudant(cloudantUsername, cloudantPassword, url=cloudantURL, adapter=httpAdapter, connect=True)
def update(event, context):
db = client['db_name']
document_id = event['pathParameters']['id']
document = db[document_id]
document['foo'] = 'bar'
document.save()
return json.dumps(document)
def get(event, context):
db = client['db_name']
document_id = event['pathParameters']['id']
document = db[document_id]
return json.dumps(document)
当我这样做时,我会在重复执行任何类型(创建,更新,获取)时获得非常低的延迟(<100ms),因为&#34;连接&#34;被重用,这是意图。 (&#34;连接&#34;在引号中,因为cloudant / couchdb没有保持打开管道的概念)。
我注意到了一些奇怪的行为 - 但是如果我调用/update
并将文档_rev
增加到2-XXXX
,则调用/get
该函数返回{{1}文档}} _rev
。如果我再次致电2-XXXX
,/update
正确递增至_rev
,但当我再次致电3-XXXX
时,我会获得文件修订/get
(即未更新)版)。发生这种情况时,更新函数在~90ms内执行,而get在~10ms内执行(实际上调用数据库的速度太快)。
我可以通过在函数处理程序中移动Cloudant客户端的设置来消除这种行为,如下所示:
2-XXXX
当我这样做时,httpAdapter = HTTPAdapter(pool_connections=5, pool_maxsize=100)
def update(event, context):
client = Cloudant(cloudantUsername, cloudantPassword, url=cloudantURL, adapter=httpAdapter, connect=True)
db = client['db_name']
document_id = event['pathParameters']['id']
document = db[document_id]
document['foo'] = 'bar'
document.save()
return json.dumps(document)
def get(event, context):
client = Cloudant(cloudantUsername, cloudantPassword, url=cloudantURL, adapter=httpAdapter, connect=True)
db = client['db_name']
document_id = event['pathParameters']['id']
document = db[document_id]
return json.dumps(document)
总是返回正确的文档修订版。这种行为是意料之外的,因为我认为将客户端设置放在处理程序之外只会在执行之间缓存客户端,但每次都会调用数据库。看起来它们是在调用/get
时创建的,而不是在调用/update
时生成的。
将客户端声明放在处理程序之外以某种方式缓存数据库?如果是这样,有没有办法阻止它这样做?
编辑:我发现通过显式调用/get
,可以强制该函数使用在处理程序外声明的客户端调用数据库,如下所示:
document.fetch()