【问题标题】:Azure functions - Pooling dbconnection for snowflake python connectorAzure 函数 - 雪花 python 连接器的池化 dbconnection
【发布时间】:2023-03-19 20:16:02
【问题描述】:

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

问题:是否可以使用函数应用程序池连接(考虑到函数应用程序是无状态的)

【问题讨论】:

  • 这能回答你的问题吗? SQL connection pooling in Azure Functions
  • 不,它没有,因为函数本质上是无状态的。每次调用函数都会再次调用连接对象。在这些场景中谁维护连接池。

标签: azure azure-functions snowflake-cloud-data-platform dbconnection


【解决方案1】:

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

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之外用生成器inc(0)的值声明了一个全局变量count,然后我可以得到一个增加的计数响应,如下图。

这与我对 SO 线程 Azure use python flask framework for function app 的另一个答案相同。

所以我觉得确实是在Azure Functions中实现一个连接池,比如在Azure Function的函数main之外用snowflakedb/snowflake-sqlalchemy在Python中为Snowflake数据库创建一个连接池,如下代码参考SQLAlchemy 文档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 启动从上到下编译源代码并将其字节码加载到内存中,然后将在触发 main 函数后从内存中调用 mypool 对象,直到从内存中删除 mypool长时间空闲后的内存。
  2. 下次空闲后触发main函数,会创建一个新的mypool对象,并继续如上。

【讨论】:

  • 有一个问题 .. 理想情况下,不应在每次调用时调用 getconn()。如果您开始记录,您将看到每次调用都会调用 taht getconn()
猜你喜欢
  • 2021-07-22
  • 1970-01-01
  • 2019-06-18
  • 2021-12-18
  • 1970-01-01
  • 2020-03-23
  • 2022-07-27
  • 1970-01-01
  • 2022-10-19
相关资源
最近更新 更多