Azure 函数 - 雪花 python 连接器的池化 dbconnection

Azure functions - Pooling dbconnection for snowflake python connector

我有一个 azure 函数应用程序 (python),它连接到雪花数据库(创建一个 dbconnection 对象),执行查询并 returns 结果,它一直运行良好。唯一的挑战是 return 查询所需的时间。每次调用时都会创建 dbconnection 对象。

问题:是否可以使用函数 app 合并连接(考虑到函数 app 是无状态的)

简短的回答是肯定的,这是我的带有 HTTP 触发器的 Azure Function 示例代码,如下所示。

import logging

import azure.functions as func

def inc(n):
    while True:
        n += 1
        yield n

count = inc(0)

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    return func.HttpResponse(f"Count: {count.__next__()}!")

我在函数main外声明了一个全局变量count,其值为生成器inc(0),然后我可以得到如下图增加的计数响应。

这与我对 SO 线程的另一个回答相同

所以我觉得确实是在Azure Functions中实现一个连接池,比如使用snowflakedb/snowflake-sqlalchemy to create a connection pool for Snowflake database in Python outside the function main of Azure Function, as the code below by refering to the SQLAlchemy document Connection Pooling

import logging
import azure.functions as func
from sqlalchemy import create_engine
import sqlalchemy.pool as pool

engine = create_engine(
    'snowflake://{user}:{password}@{account}/'.format(
        user='<your_user_login_name>',
        password='<your_password>',
        account='<your_account_name>',
    )
)

def getconn():
    connection = engine.connect()
    return connection

mypool = pool.QueuePool(getconn, max_overflow=10, pool_size=5)

def main(req: func.HttpRequest) -> func.HttpResponse:
    try:
        conn = mypool.connect()
        # Do the code what you want, such as
        # cursor = conn.cursor()
        # cursor.execute("select foo")
        ....
    finally:
        conn.close()
    return func.HttpResponse(f"......")

上面代码的解释如下

  1. Azure Functions for Python开始从上到下编译源代码并将其字节码加载到内存,然后mypool对象将在[=14=之后从内存中调用] 函数被触发,直到 mypool 在闲置很长时间后从内存中删除。
  2. 空闲后下次触发main函数时,会创建一个新的mypool对象,并继续上述操作。